[PR]

水無瀬の部屋 > Programming > sample > tools > toolwind.cpp
最終更新日: 2007/03/25

   1: //*********************************************************
   2: // プロジェクト: TOOLS
   3: //  ファイル名: toolwind.cpp
   4: //*********************************************************
   5: #include <header/toolwind.h>
   6: #include <header/tooldbg.h>   // ASSERT(), VERIFY(), 
   7: #include <header/toolbase.h>  //
   8: #include <header/toolsys.h>   //
   9: #include <header/toolptrc.h>
  10: #include <limits.h> //
  11: 
  12: 
  13: //---------------------------------------------------------
  14: // マクロ の 定義
  15: //---------------------------------------------------------
  16: #define UINT_TO_HANDLE( u )  ((HANDLE)(UINT_PTR)( u )) // _W64
  17: 
  18: 
  19: //------------------------------------------------------------------------------------------------------------------
  20: // a
  21: //------------------------------------------------------------------------------------------------------------------
  22: //*********************************************************
  23: // AllocDlgItemText
  24: //*********************************************************
  25: char *
  26: AllocDlgItemText
  27: 	(
  28: 		HWND hWnd,
  29: 		int  nID
  30: 	)
  31: {
  32: 	// パラメタの仮定
  33: 	ASSERT( IsValidWindow( hWnd ) );
  34: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
  35: 
  36: 	HWND hCtrl = GetDlgItem( hWnd, nID );
  37: 	return AllocWindowText( hCtrl );
  38: }//AllocDlgItemText
  39: 
  40: //*********************************************************
  41: // AllocWindowText
  42: //*********************************************************
  43: char *
  44: AllocWindowText
  45: 	(
  46: 		HWND hWnd
  47: 	)
  48: {
  49: 	// パラメタの仮定
  50: 	ASSERT( IsValidWindow( hWnd ) );
  51: 
  52: 	const int length = GetWindowTextLength( hWnd );
  53: 	if ( length < 0 )
  54: 		return null;
  55: 
  56: 	char *buffer = (char *)malloc( (1 + length) * sizeof( *buffer ) );
  57: 	if ( !buffer )
  58: 		return null;
  59: 
  60: 	if ( 0 <= GetWindowText( hWnd, buffer, 1 + length ) )
  61: 	{
  62: 		return buffer;
  63: 	}
  64: 
  65: 	free( buffer );
  66: 	return null;
  67: }//AllocWindowText
  68: 
  69: 
  70: //------------------------------------------------------------------------------------------------------------------
  71: // b
  72: //------------------------------------------------------------------------------------------------------------------
  73: 
  74: //------------------------------------------------------------------------------------------------------------------
  75: // c
  76: //------------------------------------------------------------------------------------------------------------------
  77: //*********************************************************
  78: // CenterWindow
  79: //*********************************************************
  80: bool
  81: CenterWindow
  82: 	(
  83: 		HWND hChild,
  84: 		HWND hParent
  85: 	)
  86: {
  87: 	// パラメタの仮定
  88: 	ASSERT( IsValidWindow( hChild ) );
  89: 	ASSERT( IsValidWindow( hParent ) );
  90: 	ASSERT( hParent == GetParent( hChild ) );
  91: 
  92: 	POINT pt;
  93: 	pt.x = ( GetWindowWidth(hParent)  - GetWindowWidth(hChild) ) / 2;
  94: 	pt.y = ( GetWindowHeight(hParent) - GetWindowHeight(hChild) ) / 2;
  95: 	VERIFY( WindowToScreen( hParent, &pt ) );
  96: 
  97: 	// デスクトップ作業領域に表示されるよう移動する
  98: 	RECT  rcWorkarea;
  99: 	VERIFY( GetWorkareaRect( &rcWorkarea ) );
 100: 	if ( pt.x > rcWorkarea.right  - GetWindowWidth(hChild)  )
 101: 		pt.x = rcWorkarea.right - GetWindowWidth(hChild);
 102: 	if ( pt.x < rcWorkarea.left                             )
 103: 		pt.x = rcWorkarea.left;
 104: 	if ( pt.y > rcWorkarea.bottom - GetWindowHeight(hChild) )
 105: 		pt.y = rcWorkarea.bottom - GetWindowHeight(hChild);
 106: 	if ( pt.y < rcWorkarea.top                              )
 107: 		pt.y = rcWorkarea.top;
 108: 
 109: 	return boolean_cast( WindowMove( hChild, pt.x, pt.y ) );
 110: }//CenterWindow
 111: 
 112: //*********************************************************
 113: // ClientRectToScreenRect
 114: // クライアント座標の矩形 rc をスクリーン座標に変換する
 115: //*********************************************************
 116: bool
 117: ClientRectToScreenRect
 118: 	(
 119: 		HWND  hWnd,
 120: 		RECT *rc
 121: 	)
 122: {
 123: 	// パラメタの仮定
 124: 	ASSERT( IsValidWindow( hWnd ) );
 125: 	ASSERT( IsValidPtr( rc, sizeof( *rc ) ) );
 126: 	ASSERT( IsValidRect( rc ) );
 127: 
 128: 	POINT pt = { 0, 0 };
 129: 	if ( !ClientToScreen( hWnd, &pt ) )
 130: 		return false;
 131: 
 132: 	VERIFY( OffsetRect( rc, pt.x , pt.y ) );
 133: 	ASSERT( IsValidRect( rc ) );
 134: 	return true;
 135: }//ClientRectToScreenRect
 136: 
 137: //*********************************************************
 138: // ClientToWindow
 139: // スクリーン座標 pt をウィンドウ座標に変換する
 140: //*********************************************************
 141: bool
 142: ClientToWindow
 143: 	(
 144: 		HWND   hWnd,
 145: 		POINT *pt
 146: 	)
 147: {
 148: 	// パラメタの仮定
 149: 	ASSERT( IsValidWindow( hWnd ) );
 150: 	ASSERT( IsValidPtr( pt, sizeof( *pt ) ) );
 151: 
 152: 	VERIFY( ClientToScreen( hWnd, pt ) );
 153: 	return ScreenToWindow( hWnd, pt );
 154: }//ClientToWindow
 155: 
 156: //*********************************************************
 157: // CreateChildWindow
 158: // 子ウィンドウを生成します
 159: // 生成した子ウィンドウへのハンドルを返します
 160: //*********************************************************
 161: HWND
 162: CreateChildWindow
 163: 	(
 164: 		      DWORD      dwExStyle,
 165: 		const char     *ClassName,
 166: 		const char     *text,
 167: 		      DWORD      dwStyle,
 168: 		      int        x,
 169: 		      int        y,
 170: 		      int        width,
 171: 		      int        height,
 172: 		      HWND       hParent,
 173: 		      UINT       uID,
 174: 		      HINSTANCE  hInstance,
 175: 		      void      *param
 176: 	)
 177: {
 178: 	// パラメタの仮定
 179: 	ASSERT( IsValidStringPtr( ClassName ) );
 180: 	ASSERT( IsValidStringPtr( text ) );
 181: 	ASSERT( WS_CHILD == (WS_CHILD & dwStyle) );
 182: 	ASSERT( IsValidWindow( hParent ) );
 183: 	ASSERT( (0 < uID) && (uID < USHRT_MAX) );
 184: 	ASSERT( IsValidInstanceHandle( hInstance ) );
 185: 
 186: 	HWND hWnd = CreateWindowEx
 187: 		(
 188: 			dwExStyle,
 189: 			ClassName,
 190: 			text,
 191: 			dwStyle,
 192: 			x,
 193: 			y,
 194: 			width,
 195: 			height,
 196: 			hParent,
 197: 			(HMENU)UINT_TO_HANDLE( uID ),
 198: 			hInstance,
 199: 			param
 200: 		);
 201: 	
 202: 	return hWnd;
 203: }//CreateChildWindow
 204: 
 205: //*********************************************************
 206: // CreateWindowIndirect
 207: // ウィンドウを生成します
 208: // 生成したウィンドウへのハンドルを返します
 209: //*********************************************************
 210: HWND
 211: CreateWindowIndirect
 212: 	(
 213: 		const CREATESTRUCT *cs
 214: 	)
 215: {
 216: 	// パラメタの仮定
 217: 	ASSERT( IsValidReadPtr( cs, sizeof( *cs ) ) );
 218: 	ASSERT( IsValidStringPtr( cs->lpszName ) );
 219: 	ASSERT( !cs->hwndParent
 220: 	      || IsValidWindow( cs->hwndParent ) );
 221: 
 222: 	return CreateWindowEx
 223: 		(
 224: 			cs->dwExStyle,     // 
 225: 			cs->lpszClass,     // 
 226: 			cs->lpszName,      // ウィンドウ・テキスト
 227: 			cs->style,         //
 228: 			cs->x,             // x 位置
 229: 			cs->y,             // y 位置
 230: 			cs->cx,            // 幅
 231: 			cs->cy,            // 高さ
 232: 			cs->hwndParent,    //
 233: 			cs->hMenu,         //
 234: 			cs->hInstance,     //
 235: 			cs->lpCreateParams //
 236: 		);
 237: }//CreateWindowIndirect
 238: 
 239: //*********************************************************
 240: // CursorInClient
 241: //*********************************************************
 242: bool
 243: CursorInClient
 244: 	(
 245: 		HWND hWnd
 246: 	)
 247: {
 248: 	// パラメタの仮定
 249: 	ASSERT( IsValidWindow( hWnd ) );
 250: 
 251: 	RECT rcClient;
 252: 	VERIFY( GetClientRect( hWnd, &rcClient ) );
 253: 
 254: 	POINT ptClient;
 255: 	VERIFY( GetClientCursorPos( hWnd, &ptClient ) );
 256: 
 257: 	return !! PtInRect( &rcClient, ptClient );
 258: }//CursorInClient
 259: 
 260: 
 261: //------------------------------------------------------------------------------------------------------------------
 262: // d
 263: //------------------------------------------------------------------------------------------------------------------
 264: //*********************************************************
 265: // DeferWindowMove
 266: //*********************************************************
 267: HDWP
 268: DeferWindowMove
 269: 	(
 270: 		HDWP *phWinPosInfo,
 271: 		HWND  hWnd, 
 272: 		int   nPosX,
 273: 		int   nPosY
 274: 	)
 275: {
 276: 	// パラメタの仮定
 277: 	ASSERT( IsValidWindow( hWnd ) );
 278: 	ASSERT( IsValidPtr( phWinPosInfo, sizeof( *phWinPosInfo ) ) );
 279: 	ASSERT( *phWinPosInfo );
 280: 
 281: 	*phWinPosInfo = DeferWindowPos( *phWinPosInfo, hWnd, null, nPosX, nPosY, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER );
 282: 	return *phWinPosInfo;
 283: }//DeferWindowMove
 284: 
 285: //*********************************************************
 286: // DialogBoxPtrParam
 287: //*********************************************************
 288: INT_PTR
 289: DialogBoxPtrParam
 290: 	(
 291: 		      HINSTANCE  hInstance,
 292: 		const char      *name,
 293: 		      HWND       hwndParent,
 294: 		      DLGPROC    proc,
 295: 		const void      *param
 296: 	)
 297: {
 298: 	// パラメタの仮定
 299: 	ASSERT( IsValidInstanceHandle( hInstance ) );
 300: 	ASSERT( IsValidResourceName( name ) );
 301: 	ASSERT( !hwndParent || IsValidWindow( hwndParent ) );
 302: 	ASSERT( IsValidCodePtr( proc ) );
 303: 
 304: 	return DialogBoxParam
 305: 		( 
 306: 			hInstance,
 307: 			name,
 308: 			hwndParent,
 309: 			proc,
 310: 			reinterpret_cast<LPARAM>( param )
 311: 		);
 312: }//DialogBoxPtrParam
 313: 
 314: 
 315: //------------------------------------------------------------------------------------------------------------------
 316: // e
 317: //------------------------------------------------------------------------------------------------------------------
 318: //*********************************************************
 319: // EnableDlgItem
 320: // ウィンドウ hWnd の識別子 nID を持つ子ウィンドウを有効化または無効化する
 321: //   bErase …… 真を指定するとウィンドウを有効化する
 322: //*********************************************************
 323: bool
 324: EnableDlgItem
 325: 	(
 326: 		HWND hWnd, 
 327: 		int  nID,
 328: 		bool bEnable
 329: 	)
 330: {
 331: 	// パラメタの仮定
 332: 	ASSERT( IsValidWindow( hWnd ) );
 333: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
 334: 
 335: 	HWND hCtrl = GetDlgItem( hWnd, nID );
 336: 	return !! EnableWindow( hCtrl, bEnable );
 337: }//EnableDlgItem
 338: 
 339: 
 340: //------------------------------------------------------------------------------------------------------------------
 341: // f
 342: //------------------------------------------------------------------------------------------------------------------
 343: 
 344: //------------------------------------------------------------------------------------------------------------------
 345: // g
 346: //------------------------------------------------------------------------------------------------------------------
 347: //*********************************************************
 348: // GetClientHeight
 349: // クライアント領域の高さを返す
 350: //*********************************************************
 351: int
 352: GetClientHeight
 353: 	(
 354: 		HWND hWnd
 355: 	)
 356: {
 357: 	// パラメタの仮定
 358: 	ASSERT( IsValidWindow( hWnd ) );
 359: 
 360: 	SIZE szClient;
 361: 	VERIFY( GetClientSize( hWnd, &szClient ) );
 362: 	return szClient.cy;
 363: }//GetClientHeight
 364: 
 365: //*********************************************************
 366: // GetClientSize
 367: // クライアント領域の大きさを得る
 368: //*********************************************************
 369: bool
 370: GetClientSize
 371: 	(
 372: 		HWND  hWnd, 
 373: 		SIZE *size
 374: 	)
 375: {
 376: 	// パラメタの仮定
 377: 	ASSERT( IsValidWindow( hWnd ) );
 378: 	ASSERT( IsValidPtr( size, sizeof( *size ) ) );
 379: 
 380: 	RECT rcClient;
 381: 	VERIFY( GetClientRect( hWnd, &rcClient ) );
 382: 	VERIFY( GetRectSize( &rcClient, size ) );
 383: 	return true;
 384: }//GetClientSize
 385: 
 386: //*********************************************************
 387: // GetClientWidth
 388: // クライアント領域の幅を返す
 389: //*********************************************************
 390: int
 391: GetClientWidth
 392: 	(
 393: 		HWND hWnd
 394: 	)
 395: {
 396: 	// パラメタの仮定
 397: 	ASSERT( IsValidWindow( hWnd ) );
 398: 
 399: 	SIZE szClient;
 400: 	VERIFY( GetClientSize( hWnd, &szClient ) );
 401: 	return szClient.cx;
 402: }//GetClientWidth
 403: 
 404: //*********************************************************
 405: // GetClassBrush
 406: //*********************************************************
 407: HBRUSH
 408: GetClassBrush
 409: 	(
 410: 		HWND hWnd
 411: 	)
 412: {
 413: 	// パラメタの仮定
 414: 	ASSERT( IsValidWindow( hWnd ) );
 415: 
 416: 	return (HBRUSH)GetClassLongPtr64( hWnd, GCL_HBRBACKGROUND );
 417: }//GetClassBrush
 418: 
 419: //*********************************************************
 420: // GetClassCursor
 421: //*********************************************************
 422: HCURSOR
 423: GetClassCursor
 424: 	(
 425: 		HWND hWnd
 426: 	)
 427: {
 428: 	// パラメタの仮定
 429: 	ASSERT( IsValidWindow( hWnd ) );
 430: 
 431: 	return (HCURSOR)GetClassLongPtr64( hWnd, GCL_HCURSOR );
 432: }//GetClassCursor
 433: 
 434: //*********************************************************
 435: // GetClassIcon
 436: //   fType --- ICON_BIG, ICON_SMALL
 437: //*********************************************************
 438: HICON
 439: GetClassIcon
 440: 	(
 441: 		HWND   hWnd,
 442: 		WPARAM fType
 443: 	)
 444: {
 445: 	// パラメタの仮定
 446: 	ASSERT( IsValidWindow( hWnd ) );
 447: 	ASSERT( ( ICON_BIG   == fType )
 448: 	     || ( ICON_SMALL == fType ) );
 449: 
 450: 	return (HICON)GetClassLongPtr64( hWnd, (ICON_BIG == fType) ? GCL_HICON : GCL_HICONSM );
 451: }//GetClassIcon
 452: 
 453: //*********************************************************
 454: // GetClassModule
 455: //*********************************************************
 456: HMODULE
 457: GetClassModule
 458: 	(
 459: 		HWND hWnd
 460: 	)
 461: {
 462: 	// パラメタの仮定
 463: 	ASSERT( IsValidWindow( hWnd ) );
 464: 
 465: 	return (HMODULE)GetClassLongPtr64( hWnd, GCL_HMODULE );
 466: }//GetClassModule
 467: 
 468: //*********************************************************
 469: // GetClassStyle
 470: //*********************************************************
 471: DWORD
 472: GetClassStyle
 473: 	(
 474: 		HWND hWnd
 475: 	)
 476: {
 477: 	// パラメタの仮定
 478: 	ASSERT( IsValidWindow( hWnd ) );
 479: 
 480: 	return (DWORD)GetClassLongPtr64( hWnd, GCL_STYLE );
 481: }//GetClassStyle
 482: 
 483: //*********************************************************
 484: // GetCurrentDisplaySetting
 485: //*********************************************************
 486: bool
 487: GetCurrentDisplaySetting
 488: 	(
 489: 		DEVMODE *dev
 490: 	)
 491: {
 492: 	// パラメタの仮定
 493: 	ASSERT( IsValidPtr( dev, sizeof( *dev ) ) );
 494: 
 495: 	return !! EnumDisplaySettings( null, ENUM_CURRENT_SETTINGS, dev );
 496: }//GetCurrentDisplaySetting
 497: 
 498: //*********************************************************
 499: // GetDragFileCount
 500: //*********************************************************
 501: UINT
 502: GetDragFileCount
 503: 	(
 504: 		HDROP hDrop
 505: 	)
 506: {
 507: 	// パラメタの仮定
 508: //	ASSERT( hDrop );
 509: 
 510: 	return DragQueryFile( hDrop, 0xFFFFFFFF, null, 0 );
 511: }//GetDragFileCount
 512: 
 513: //*********************************************************
 514: // GetDlgItemTop
 515: //*********************************************************
 516: int
 517: GetDlgItemTop
 518: 	(
 519: 		HWND hWnd,
 520: 		int  nID
 521: 	)
 522: {
 523: 	// パラメタの仮定
 524: 	ASSERT( IsValidWindow( hWnd ) );
 525: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
 526: 
 527: 	HWND hCtrl = GetDlgItem( hWnd, nID );
 528: 	return GetWindowTop( hCtrl );
 529: }//GetDlgItemTop
 530: 
 531: //*********************************************************
 532: // GetDlgItemBottom
 533: //*********************************************************
 534: int
 535: GetDlgItemBottom
 536: 	(
 537: 		HWND hWnd,
 538: 		int  nID
 539: 	)
 540: {
 541: 	// パラメタの仮定
 542: 	ASSERT( IsValidWindow( hWnd ) );
 543: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
 544: 
 545: 	HWND hCtrl = GetDlgItem( hWnd, nID );
 546: 	return GetWindowBottom( hCtrl );
 547: }//GetDlgItemBottom
 548: 
 549: //*********************************************************
 550: // GetDlgItemTextLength
 551: //*********************************************************
 552: int
 553: GetDlgItemTextLength
 554: 	(
 555: 		HWND hWnd,
 556: 		int  nID
 557: 	)
 558: {
 559: 	// パラメタの仮定
 560: 	ASSERT( IsValidWindow( hWnd ) );
 561: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
 562: 
 563: 	HWND hCtrl = GetDlgItem( hWnd, nID );
 564: 	return GetWindowTextLength( hCtrl );
 565: }//GetDlgItemTextLength
 566: 
 567: //*********************************************************
 568: // GetMenuItemPos()
 569: //   メニュー項目 の 0 開始位置 を得る。
 570: //   項目が見つからない場合は -1 を返す。
 571: //
 572: // HMENU hMenu
 573: //   項目を含む 親メニュー のハンドル
 574: //
 575: // UINT uID
 576: //   位置を求めるメニュー項目の 項目識別子
 577: //
 578: //*********************************************************
 579: int // 0 開始位置
 580: GetMenuItemPos
 581: 	(
 582: 		HMENU hMenu, // 親メニューのハンドル
 583: 		UINT  uID    // メニュー項目の項目識別子
 584: 	)
 585: {
 586: 	// パラメタの仮定
 587: 	ASSERT( IsValidMenu( hMenu ) );
 588: 	ASSERT( INVALID_MENUITEMID != uID );
 589: 
 590: 	const int count = GetMenuItemCount( hMenu );
 591: 	{for( int pos = 0; pos < count; ++pos )
 592: 	{
 593: 		if ( uID == GetMenuItemID( hMenu, pos ) )
 594: 			return pos;
 595: 	}}
 596: 
 597: 	return -1;
 598: }//GetMenuItemPos
 599: 
 600: //*********************************************************
 601: // GetMenuStringLength()
 602: //   メニュー項目 の 文字列長 を得る。
 603: //   関数が失敗すると 0 を返す。
 604: //
 605: // HMENU hMenu
 606: //   項目を含む 親メニュー のハンドル
 607: //
 608: // UINT uID
 609: //   flags が MF_BYCOMMAND の場合
 610: //     メニュー項目の 項目識別子
 611: //   flags が MF_BYPOSITION の場合
 612: //     メニュー項目の 0 開始位置
 613: //
 614: // UINT flags
 615: //   uID の意味を指定する。
 616: //   MF_BYCOMMAND or MF_BYPOSITION
 617: //
 618: //*********************************************************
 619: int // 文字列長
 620: GetMenuStringLength
 621: 	(
 622: 		HMENU hMenu, // 親メニューのハンドル
 623: 		UINT  uID,   // メニュー項目の 識別子 or 位置
 624: 		UINT  flags  // MF_BYCOMMAND or MF_BYPOSITION
 625: 	)
 626: {
 627: 	// パラメタの仮定
 628: 	ASSERT( IsValidMenu( hMenu ) );
 629: 	ASSERT( INVALID_MENUITEMID != uID );
 630: 	ASSERT( (MF_BYCOMMAND  == flags)
 631: 	     || (MF_BYPOSITION == flags) );
 632: 
 633: 	return GetMenuString( hMenu, uID, null, 0, flags );
 634: }//GetMenuStringLength
 635: 
 636: //*********************************************************
 637: // GetNextDlgItem
 638: // ウィンドウ hDlg の識別子 nID を持つ子ウィンドウの次のウィンドウを得る
 639: //*********************************************************
 640: HWND // 次のウィンドウ
 641: GetNextDlgItem
 642: 	(
 643: 		HWND hDlg, //
 644: 		int  nID   //
 645: 	)
 646: {
 647: 	// パラメタの仮定
 648: 	ASSERT( IsValidWindow( hDlg ) );
 649: 	ASSERT( IsValidDlgItem( hDlg, nID ) );
 650: 
 651: 	HWND hwndDlgItem = GetDlgItem( hDlg, nID );
 652: 	return GetNextWindow( hwndDlgItem, GW_HWNDNEXT );
 653: }//GetNextDlgItem
 654: 
 655: //*********************************************************
 656: // GetNotifyMessageControlID
 657: //*********************************************************
 658: UINT_PTR
 659: GetNotifyMessageControlID
 660: 	(
 661: 		LPARAM lParam
 662: 	)
 663: {
 664: 	// パラメタの仮定
 665: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof( NMHDR ) ) );
 666: 
 667: 	const NMHDR *nmhdr = GetNotifyMessageParam( lParam );
 668: 	return nmhdr->idFrom;
 669: }//GetNotifyMessageControlID
 670: 
 671: //*********************************************************
 672: // GetNotifyMessageNotifyCode
 673: //*********************************************************
 674: UINT
 675: GetNotifyMessageNotifyCode
 676: 	(
 677: 		LPARAM lParam
 678: 	)
 679: {
 680: 	// パラメタの仮定
 681: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof( NMHDR ) ) );
 682: 
 683: 	const NMHDR *nmhdr = GetNotifyMessageParam( lParam );
 684: 	return nmhdr->code;
 685: }//GetNotifyMessageNotifyCode
 686: 
 687: //*********************************************************
 688: // GetNotifyMessageParam
 689: //*********************************************************
 690: NMHDR *
 691: GetNotifyMessageParam
 692: 	(
 693: 		LPARAM lParam
 694: 	)
 695: {
 696: 	// パラメタの仮定
 697: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof( NMHDR ) ) );
 698: 
 699: 	return reinterpret_cast<NMHDR *>( lParam );
 700: }//GetNotifyMessageParam
 701: 
 702: //*********************************************************
 703: // GetNotifyMessageWindow
 704: //*********************************************************
 705: HWND
 706: GetNotifyMessageWindow
 707: 	(
 708: 		LPARAM lParam
 709: 	)
 710: {
 711: 	// パラメタの仮定
 712: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof( NMHDR ) ) );
 713: 
 714: 	const NMHDR *nmhdr = GetNotifyMessageParam( lParam );
 715: 	return nmhdr->hwndFrom;
 716: }//GetNotifyMessageWindow
 717: 
 718: //*********************************************************
 719: // GetScreenRect
 720: //   デスクトップ領域の矩形 rcScreen を得る
 721: //*********************************************************
 722: bool
 723: GetScreenRect
 724: 	(
 725: 		RECT *rcScreen
 726: 	)
 727: {
 728: 	// パラメタの仮定
 729: 	ASSERT( IsValidPtr( rcScreen, sizeof( *rcScreen ) ) );
 730: 
 731: 	rcScreen->left   = 0;
 732: 	rcScreen->top    = 0;
 733: 	rcScreen->right  = GetSystemMetrics(SM_CXSCREEN);
 734: 	rcScreen->bottom = GetSystemMetrics(SM_CYSCREEN);
 735: 	ASSERT( IsValidRect( rcScreen ) );
 736: 	return true;
 737: }//GetScreenRect
 738: 
 739: //*********************************************************
 740: // GetWindowTop
 741: //*********************************************************
 742: int
 743: GetWindowTop
 744: 	(
 745: 		HWND hWnd
 746: 	)
 747: {
 748: 	// パラメタの仮定
 749: 	ASSERT( IsValidWindow( hWnd ) );
 750: 
 751: 	POINT pt;
 752: 	GetWindowPoint(hWnd, &pt);
 753: 	return pt.y;
 754: }//GetWindowTop
 755: 
 756: //*********************************************************
 757: // GetWindowBottom
 758: //*********************************************************
 759: int
 760: GetWindowBottom
 761: 	(
 762: 		HWND hWnd
 763: 	)
 764: {
 765: 	// パラメタの仮定
 766: 	ASSERT( IsValidWindow( hWnd ) );
 767: 
 768: 	return GetWindowTop( hWnd ) + GetWindowHeight( hWnd );
 769: }//GetWindowBottom
 770: 
 771: //*********************************************************
 772: // GetWindowHeight
 773: // ウィンドウ hWnd の高さを返す
 774: //*********************************************************
 775: int
 776: GetWindowHeight
 777: 	(
 778: 		HWND hWnd
 779: 	)
 780: {
 781: 	// パラメタの仮定
 782: 	ASSERT( IsValidWindow( hWnd ) );
 783: 
 784: 	SIZE szWindow;
 785: 	VERIFY( GetWindowSize( hWnd, &szWindow ) );
 786: 	return szWindow.cy;
 787: }//GetWindowHeight
 788: 
 789: //*********************************************************
 790: // GetWindowIcon
 791: //   fType …… ICON_BIG, ICON_SMALL
 792: //*********************************************************
 793: HICON
 794: GetWindowIcon
 795: 	(
 796: 		HWND   hWnd,
 797: 		WPARAM fType
 798: 	)
 799: {
 800: 	// パラメタの仮定
 801: 	ASSERT( IsValidWindow( hWnd ) );
 802: 	ASSERT( (ICON_BIG   == fType)
 803: 	     || (ICON_SMALL == fType) );
 804: 
 805: 	return (HICON)SendMessage( hWnd, WM_GETICON, fType, 0 );
 806: }//GetWindowIcon
 807: 
 808: //*********************************************************
 809: // GetWindowLogFont
 810: //*********************************************************
 811: bool
 812: GetWindowLogFont
 813: 	(
 814: 		HWND     hWnd,
 815: 		LOGFONT *lf
 816: 	)
 817: {
 818: 	// パラメタの仮定
 819: 	ASSERT( IsValidWindow( hWnd ) );
 820: 	ASSERT( IsValidPtr( lf, sizeof( *lf ) ) );
 821: 
 822: 	HFONT hFont = GetWindowFont( hWnd );
 823: 	if ( !hFont )
 824: 		return false;
 825: 
 826: 	//
 827: 	if ( sizeof( *lf ) != GetObject( hFont, sizeof( *lf ), lf ) )
 828: 		return false;
 829: 
 830: 	return true;
 831: }//GetWindowLogFont
 832: 
 833: //*********************************************************
 834: // GetWindowNormalHeight
 835: // ウィンドウ hWnd の復元時の高さを返す
 836: //*********************************************************
 837: int
 838: GetWindowNormalHeight
 839: 	(
 840: 		HWND hWnd
 841: 	)
 842: {
 843: 	// パラメタの仮定
 844: 	ASSERT( IsValidWindow( hWnd ) );
 845: 
 846: 	RECT rcWindow;
 847: 	VERIFY( GetWindowNormalRect( hWnd, &rcWindow ) );
 848: 	return GetRectHeight( &rcWindow );
 849: }//GetWindowNormalHeight
 850: 
 851: //*********************************************************
 852: // GetWindowNormalRect
 853: //*********************************************************
 854: bool
 855: GetWindowNormalRect
 856: 	(
 857: 		HWND  hWnd,
 858: 		RECT *rcWindow
 859: 	)
 860: {
 861: 	// パラメタの仮定
 862: 	ASSERT( IsValidWindow( hWnd ) );
 863: 	ASSERT( IsValidPtr( rcWindow, sizeof( *rcWindow ) ) );
 864: 
 865: 	//
 866: 	WINDOWPLACEMENT wndpl;
 867: 	memzero( &wndpl, sizeof( wndpl ) );
 868: 	wndpl.length = sizeof( wndpl );
 869: 	const bool bSuccess = !! GetWindowPlacement( hWnd, &wndpl );
 870: 	ASSERT( IsValidRect( &wndpl.rcNormalPosition ) );
 871: 
 872: 	//
 873: 	VERIFY( CopyRect( rcWindow, &wndpl.rcNormalPosition ) );
 874: 	ASSERT( IsValidRect( rcWindow ) );
 875: 	return bSuccess;
 876: }//GetWindowNormalRect
 877: 
 878: //*********************************************************
 879: // GetWindowNormalWidth
 880: // ウィンドウ hWnd の復元時の幅を返す
 881: //*********************************************************
 882: int
 883: GetWindowNormalWidth
 884: 	(
 885: 		HWND hWnd
 886: 	)
 887: {
 888: 	// パラメタの仮定
 889: 	ASSERT( IsValidWindow( hWnd ) );
 890: 
 891: 	RECT rcWindow;
 892: 	VERIFY( GetWindowNormalRect( hWnd, &rcWindow ) );
 893: 	return GetRectWidth( &rcWindow );
 894: }//GetWindowNormalWidth
 895: 
 896: //*********************************************************
 897: // GetWindowPoint
 898: // ウィンドウ hWnd の左上隅のスクリーン座標を得る
 899: //*********************************************************
 900: bool
 901: GetWindowPoint
 902: 	(
 903: 		HWND   hWnd,
 904: 		POINT *pt
 905: 	)
 906: {
 907: 	// パラメタの仮定
 908: 	ASSERT( IsValidWindow( hWnd ) );
 909: 	ASSERT( IsValidPtr( pt, sizeof( *pt ) ) );
 910: 
 911: 	RECT rcWindow;
 912: 	VERIFY( GetWindowRect( hWnd, &rcWindow ) );
 913: 	VERIFY( MakePoint( pt, rcWindow.left, rcWindow.top ) );
 914: 	return true;
 915: }//GetWindowPoint
 916: 
 917: //*********************************************************
 918: // GetWindowPriority
 919: //*********************************************************
 920: bool
 921: GetWindowPriority
 922: 	(
 923: 		HWND   hWnd, 
 924: 		DWORD *pdwPriorityClass
 925: 	)
 926: {
 927: 	// パラメタの仮定
 928: 	ASSERT( IsValidWindow( hWnd ) );
 929: 	ASSERT( IsValidPtr( pdwPriorityClass, sizeof( *pdwPriorityClass ) ) );
 930: 
 931: 	HANDLE hProcess = OpenWindowProcess( hWnd, PROCESS_ALL_ACCESS, false );
 932: 	if ( !hProcess )
 933: 		return false;
 934: 
 935: 	*pdwPriorityClass = GetPriorityClass( hProcess );
 936: 	VERIFY( CloseHandle( hProcess ) );
 937: 	return true;
 938: }//GetWindowPriority
 939: 
 940: //*********************************************************
 941: // GetWindowSize
 942: // ウィンドウ hWnd の大きさを得る
 943: //*********************************************************
 944: bool
 945: GetWindowSize
 946: 	(
 947: 		HWND  hWnd,
 948: 		SIZE *size
 949: 	)
 950: {
 951: 	// パラメタの仮定
 952: 	ASSERT( IsValidWindow( hWnd ) );
 953: 	ASSERT( IsValidPtr( size, sizeof( *size ) ) );
 954: 
 955: 	RECT rcWindow;
 956: 	VERIFY( GetWindowRect( hWnd, &rcWindow ) );
 957: 	VERIFY( GetRectSize( &rcWindow, size ) );
 958: 	return true;
 959: }//GetWindowSize
 960: 
 961: //*********************************************************
 962: // GetWindowWidth
 963: // ウィンドウ hWnd の幅を返す
 964: //*********************************************************
 965: int
 966: GetWindowWidth
 967: 	(
 968: 		HWND hWnd 
 969: 	)
 970: {
 971: 	// パラメタの仮定
 972: 	ASSERT( IsValidWindow( hWnd ) );
 973: 
 974: 	SIZE szWindow;
 975: 	VERIFY( GetWindowSize( hWnd, &szWindow ) );
 976: 	return szWindow.cx;
 977: }//GetWindowWidth
 978: 
 979: //*********************************************************
 980: // GetWorkareaRect
 981: //   デスクトップ作業領域の矩形 rcWorkarea を得る
 982: //*********************************************************
 983: bool
 984: GetWorkareaRect
 985: 	(
 986: 		RECT *rcWorkarea
 987: 	)
 988: {
 989: 	// パラメタの仮定
 990: 	ASSERT( IsValidPtr( rcWorkarea, sizeof( *rcWorkarea ) ) );
 991: 
 992: 	return !! SystemParametersInfo( SPI_GETWORKAREA, 0, rcWorkarea, 0 );
 993: }//GetWorkareaRect
 994: 
 995: 
 996: //------------------------------------------------------------------------------------------------------------------
 997: // h
 998: //------------------------------------------------------------------------------------------------------------------
 999: 
1000: //------------------------------------------------------------------------------------------------------------------
1001: // i
1002: //------------------------------------------------------------------------------------------------------------------
1003: //*********************************************************
1004: // InvalidateDlgItem 
1005: // ウィンドウ hWnd の識別子 nID を持つ子ウィンドウのクライアント領域全体を更新領域に追加する
1006: //   bErase …… 真を指定すると更新領域が処理される時に更新領域内の背景が消去される
1007: //*********************************************************
1008: bool
1009: InvalidateDlgItem
1010: 	(
1011: 		HWND hWnd,
1012: 		int  nID,
1013: 		bool bErase
1014: 	)
1015: {
1016: 	// パラメタの仮定
1017: 	ASSERT( IsValidWindow( hWnd ) );
1018: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
1019: 
1020: 	HWND hCtrl = GetDlgItem( hWnd, nID );
1021: 	return InvalidateWindow( hCtrl, bErase );
1022: }//InvalidateDlgItem
1023: 
1024: //*********************************************************
1025: // InvalidateWindow 
1026: // ウィンドウのクライアント領域全体を更新領域に追加する
1027: //   bErase …… 真を指定すると更新領域が処理される時に更新領域内の背景が消去される
1028: //*********************************************************
1029: bool
1030: InvalidateWindow
1031: 	(
1032: 		HWND hWnd,
1033: 		bool bErase
1034: 	)
1035: {
1036: 	// パラメタの仮定
1037: 	ASSERT( IsValidWindow( hWnd ) );
1038: 
1039: 	return boolean_cast( InvalidateRect( hWnd, null, bErase ) );
1040: }//InvalidateWindow
1041: 
1042: //*********************************************************
1043: // IsClassNameWindow
1044: // ウィンドウ hWnd のクラス名が ClassName であれば真を返す
1045: //*********************************************************
1046: bool
1047: IsClassNameWindow
1048: 	(
1049: 		      HWND   hWnd,
1050: 		const char *ClassName
1051: 	)
1052: {
1053: 	// パラメタの仮定
1054: 	ASSERT( IsValidWindow( hWnd ) );
1055: 	ASSERT( IsValidStringPtr( ClassName ) );
1056: 
1057: 	// クラス名を得る
1058: 	char buffer[ MAX_CLASSNAME+1 ];
1059: 	if ( 0 >= GetClassName( hWnd, buffer, numof(buffer)-1 ) )
1060: 		return false;
1061: 
1062: 	// クラス名を比較する
1063: 	ASSERT( IsValidStringPtr( buffer ) );
1064: 	return streql( buffer, ClassName );
1065: }//IsClassNameWindow
1066: 
1067: //*********************************************************
1068: // IsDlgItemEnabled
1069: // ウィンドウ hWnd の識別子 nID を持つ子ウィンドウが使用可能状態であれば真を返す
1070: //*********************************************************
1071: bool
1072: IsDlgItemEnabled
1073: 	(
1074: 		HWND hWnd,
1075: 		int  nID
1076: 	)
1077: {
1078: 	// パラメタの仮定
1079: 	ASSERT( IsValidWindow( hWnd ) );
1080: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
1081: 
1082: 	HWND hCtrl = GetDlgItem( hWnd, nID );
1083: 	return !! IsWindowEnabled( hCtrl );
1084: }//IsDlgItemEnabled
1085: 
1086: //*********************************************************
1087: // IsDlgItemVisible
1088: // ウィンドウ hWnd の識別子 nID を持つ子ウィンドウが表示状態であれば真を返す
1089: //*********************************************************
1090: bool
1091: IsDlgItemVisible
1092: 	(
1093: 		HWND hWnd, 
1094: 		int  nID
1095: 	)
1096: {
1097: 	// パラメタの仮定
1098: 	ASSERT( IsValidWindow( hWnd ) );
1099: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
1100: 
1101: 	HWND hCtrl = GetDlgItem( hWnd, nID );
1102: 	return !! IsWindowVisible( hCtrl );
1103: }//IsDlgItemVisible
1104: 
1105: //*********************************************************
1106: // IsMenuItemChecked()
1107: //   メニュー項目 の チェック状態 を取得する。
1108: //   メニュー項目にチェックがされていれば 真 を返す。
1109: //   指定された メニュー項目 が無い場合は 偽 を返す。
1110: //
1111: // HMENU hMenu
1112: //   変更対象のメニュー項目を持つ 親メニュー のハンドル
1113: //
1114: // UINT uID
1115: //   flags が MF_BYCOMMAND の場合
1116: //     メニュー項目の 項目識別子
1117: //   flags が MF_BYPOSITION の場合
1118: //     メニュー項目の 0 開始位置
1119: //
1120: // UINT flags
1121: //   uID の意味を指定する。
1122: //   MF_BYCOMMAND or MF_BYPOSITION
1123: //
1124: //*********************************************************
1125: bool // チェックがされていれば 真
1126: IsMenuItemChecked
1127: 	(
1128: 		HMENU hMenu, // 親メニューのハンドル
1129: 		UINT  uID,   // メニュー項目の 識別子 or 位置
1130: 		UINT  flags  // MF_BYCOMMAND or MF_BYPOSITION
1131: 	)
1132: {
1133: 	// パラメタの仮定
1134: 	ASSERT( IsValidMenu( hMenu ) );
1135: 	ASSERT( INVALID_MENUITEMID != uID );
1136: 	ASSERT( (MF_BYCOMMAND  == flags)
1137: 	     || (MF_BYPOSITION == flags) );
1138: 
1139: 	// 関数が失敗した場合は 偽 を返す。
1140: 	const UINT state = GetMenuState( hMenu, uID, flags );
1141: 	if ( INVALID_MENUITEMSTATE == state )
1142: 	{
1143: 		return false;
1144: 	}
1145: 
1146: 	return MF_CHECKED == (MF_CHECKED & state);
1147: }//IsMenuItemChecked
1148: 
1149: //*********************************************************
1150: // IsValidCharMessageParam - WM_CHAR
1151: // 文字キーが押下された
1152: // 常に 0L を返す
1153: //   wParam …… 押下された文字の文字コード
1154: //   lParam …… キーの押下に関する詳細
1155: //                0-15 …… 繰り返し数
1156: //               16-23 …… スキャンコード
1157: //                  24 …… 拡張キーであれば 1 が設定される
1158: //                  30 …… 自動反復中であれば 1 が設定される
1159: //
1160: // 使用例:
1161: //	ASSERT( IsValidCharMessageParam( wParam, lParam ) );
1162: //
1163: //*********************************************************
1164: bool
1165: IsValidCharMessageParam
1166: 	(
1167: 		WPARAM wParam,
1168: 		LPARAM lParam
1169: 	)
1170: {
1171: 	VALID_TEST(      0 == (BIT( 29 ) & lParam) );
1172: 	VALID_TEST(      0 == (BIT( 31 ) & lParam) );
1173: 	VALID_TEST( wParam == (    0xFF  & wParam) );
1174: 	VALID_TEST( !jms1( wParam ) ); // 2バイト文字は独自に処理されているはず。
1175: 
1176: 	return true;
1177: }//IsValidCharMessageParam
1178: 
1179: //*********************************************************
1180: // IsValidCommandMessageParam() - WM_COMMAND
1181: // コマンド項目が選択された。
1182: // 返値の意味は要求されたコマンド項目による。
1183: //   LOWORD(wParam) …… 選択されたコマンド項目の識別子。
1184: //                     メニューの区切り線が選択された場合は 0 が設定される。
1185: //   HIWORD(wParam) …… 通知コード。
1186: //                     メッセージが  メニュー  から送信された場合は 0 が設定される。
1187: //                     メッセージがアクセラレータから送信された場合は 1 が設定される。
1188: //   HWND lParam    …… メッセージがコントロールから送信された場合はメッセージを送信したコントロールのハンドル。
1189: //
1190: // 使用例:
1191: //	ASSERT( IsValidCommandMessageParam( wParam, lParam ) );
1192: //
1193: //*********************************************************
1194: bool
1195: IsValidCommandMessageParam
1196: 	(
1197: 		WPARAM wParam,
1198: 		LPARAM lParam
1199: 	)
1200: {
1201: 	const WORD wID         = LOWORD( wParam );
1202: 	const WORD wNotifyCode = HIWORD( wParam );
1203: 	HWND       hwndCtl     = reinterpret_cast<HWND>( lParam );
1204: 
1205: 	VALID_TEST(  ( 0 != wID )
1206: 	         || (( 0 == wID ) && ( 0 == wNotifyCode )) );
1207: 	VALID_TEST( ( 0 == wNotifyCode )
1208: 	         || ( 1 == wNotifyCode )
1209: 	         || IsValidWindow( hwndCtl ) );
1210: 
1211: 	return true;
1212: }//IsValidCommandMessageParam
1213: 
1214: //*********************************************************
1215: // IsValidControlColorDialogMessageParam - WM_CTLCOLORDLG
1216: // ダイアログが描画される。
1217: // ダイアログ背景を描画するための ブラシ を返す。
1218: //   HDC  wParam …… ダイアログのデバイスコンテキスト
1219: //   HWND lParam …… ダイアログのハンドル
1220: //
1221: // 使用例:
1222: //	ASSERT( IsValidControlColorDialogMessageParam( wParam, lParam ) );
1223: //
1224: //*********************************************************
1225: bool
1226: IsValidControlColorDialogMessageParam
1227: 	(
1228: 		WPARAM wParam,
1229: 		LPARAM lParam
1230: 	)
1231: {
1232: 	VALID_TEST( IsValidDeviceContextHandle( reinterpret_cast<HDC>( wParam ) ) );
1233: 	VALID_TEST( IsValidWindow( reinterpret_cast<HWND>( lParam ) ) );
1234: 
1235: 	return true;
1236: }//IsValidControlColorDialogMessageParam
1237: 
1238: //*********************************************************
1239: // IsValidControlColorStaticMessageParam - WM_CTLCOLORSTATIC
1240: // スタティック・コントロールが描画される。
1241: // コントロールの背景を描画するための ブラシ を返す。
1242: //   HDC  wParam …… コントロール の デバイスコンテキスト
1243: //   HWND lParam …… コントロール の ウィンドウハンドル
1244: //
1245: // 使用例:
1246: //	ASSERT( IsValidControlColorStaticMessageParam( wParam, lParam ) );
1247: //
1248: //*********************************************************
1249: bool
1250: IsValidControlColorStaticMessageParam
1251: 	(
1252: 		WPARAM wParam,
1253: 		LPARAM lParam
1254: 	)
1255: {
1256: 	VALID_TEST( IsValidDeviceContextHandle( reinterpret_cast<HDC>( wParam ) ) );
1257: 	VALID_TEST( IsValidWindow( reinterpret_cast<HWND>( lParam ) ) );
1258: 
1259: 	return true;
1260: }//IsValidControlColorStaticMessageParam
1261: 
1262: //*********************************************************
1263: // IsValidDlgItem
1264: // ウィンドウ hWnd に識別子 nID を持つ子ウィンドウが存在するならば真を返す
1265: //*********************************************************
1266: bool
1267: IsValidDlgItem
1268: 	(
1269: 		HWND hwndDlg,
1270: 		int  nID
1271: 	)
1272: {
1273: 	VALID_TEST( IsValidWindow( hwndDlg ) );
1274: 	
1275: 	HWND hwndCtrl = GetDlgItem( hwndDlg, nID );
1276: 	VALID_TEST( IsValidWindow( hwndCtrl ) );
1277: 
1278: 	return true;
1279: }//IsValidDlgItem
1280: 
1281: //*********************************************************
1282: // IsValidInitDialogMessageParam - WM_INITDIALOG
1283: // ダイアログが作成された。
1284: // この関数が抜けるまでダイアログは表示されない。
1285: // 明示的にフォーカスを移動した場合は 真 を返せ。
1286: // さもなくば 偽 を返せ。
1287: //   HWND   wParam …… フォーカスを受け取る予定のコントロール
1288: //   LPARAM lParam …… ダイアログの初期化パラメタ
1289: //
1290: // 使用例:
1291: //	ASSERT( !IsWindowVisible( hWnd ) );
1292: //	ASSERT(  IsValidInitDialogMessageParam( wParam, lParam ) );
1293: //
1294: //*********************************************************
1295: bool
1296: IsValidInitDialogMessageParam
1297: 	(
1298: 		WPARAM wParam,
1299: 		LPARAM 
1300: 	)
1301: {
1302: 	VALID_TEST( IsValidWindow( reinterpret_cast<HWND>( wParam ) ) );
1303: 
1304: 	return true;
1305: }//IsValidInitDialogMessageParam
1306: 
1307: //*********************************************************
1308: // IsValidKeyDownMessageParam - WM_KEYDOWN
1309: // キーが押下された
1310: // 返値の意味は押下されたキーの種類による
1311: //   wParam …… 押下されたキーの仮想キーコード
1312: //   lParam …… キーの押下に関する詳細
1313: //                0-15 …… 繰り返し数
1314: //               16-23 …… スキャンコード
1315: //                  24 …… 拡張キーであれば 1 が設定される
1316: //               25-28 …… 使用せず
1317: //                  29 …… コンテキストキー <詳細不明> 
1318: //                  30 …… 自動反復中であれば 1 が設定される
1319: //                  31 …… WM_KEYDOWN では常に 0 が設定される
1320: //
1321: // 使用例:
1322: //	ASSERT( IsValidKeyDownMessageParam( wParam, lParam ) );
1323: //
1324: //*********************************************************
1325: bool
1326: IsValidKeyDownMessageParam
1327: 	(
1328: 		WPARAM wParam,
1329: 		LPARAM lParam
1330: 	)
1331: {
1332: 	VALID_TEST( wParam == (    0xFF  & wParam) );
1333: 	VALID_TEST(      0 == (BIT( 31 ) & lParam) );
1334: 
1335: 	return true;
1336: }//IsValidKeyDownMessageParam
1337: 
1338: //*********************************************************
1339: // IsValidInitMenuPopupMessageParam - WM_INITMENUPOPUP
1340: // ポップアップ・メニューがアクティブになる。
1341: //   HMENU wParam         …… メニューへのハンドル
1342: //   UINT  LOWORD(lParam) …… 親メニュー座標での 0 からの相対位置
1343: //   bool  HIWORD(lParam) …… システムメニューであれば 真 
1344: //
1345: // 使用例:
1346: //	ASSERT( IsValidInitMenuPopupMessageParam( wParam, lParam ) );
1347: //
1348: //*********************************************************
1349: bool
1350: IsValidInitMenuPopupMessageParam
1351: 	(
1352: 		WPARAM wParam,
1353: 		LPARAM 
1354: 	)
1355: {
1356: 	VALID_TEST( IsValidMenu( reinterpret_cast<HMENU>( wParam ) ) );
1357: 
1358: 	return true;
1359: }//IsValidInitMenuPopupMessageParam
1360: 
1361: //*********************************************************
1362: // IsValidMenu()
1363: //   ハンドル hMenu が メニュー であれば 真 を返す。
1364: //
1365: // HMENU hMenu
1366: //   メニューのハンドルかどうか調べる ハンドル
1367: //
1368: //*********************************************************
1369: bool // メニューへのハンドル であれば 真 
1370: IsValidMenu
1371: 	(
1372: 		HMENU hMenu // メニューへのハンドル
1373: 	)
1374: {
1375: 	VALID_TEST( hMenu );
1376: 	VALID_TEST( IsMenu( hMenu ) );
1377: 
1378: 	return true;
1379: }//IsValidMenu
1380: 
1381: //*********************************************************
1382: // IsValidMenuSelectMessageParam - WM_MENUSELECT
1383: // メニュー項目の選択状態が変化した
1384: // 選択項目についての説明を表示する
1385: // 常に 0L を返す
1386: //   UINT  LOWORD(wParam) …… 選択状態にあるメニュー項目の識別子
1387: //                           選択項目がサブメニューである場合は親メニュー中の 0 基準位置
1388: //   UINT  HIWORD(wParam) …… 選択状態にあるメニュー項目の種類の組み合わせ
1389: //                           メニューが閉じられた場合には 0xFFFF が設定される
1390: //                           メニューがマウスで選択された場合には MF_MOUSESELECT が追加設定される
1391: //                           MF_CHECKED, MF_POPUP, MF_SYSMENU, MF_MENUBARBREAK, ... 
1392: //   HMENU lParam         …… 選択項目がサブメニューである場合はサブメニューの親メニューのハンドル
1393: //                           メニューが閉じられた場合には null が設定される
1394: //
1395: // 使用例:
1396: //	ASSERT( IsValidMenuSelectMessageParam( wParam, lParam ) );
1397: //
1398: //*********************************************************
1399: bool
1400: IsValidMenuSelectMessageParam
1401: 	(
1402: 		WPARAM wParam,
1403: 		LPARAM lParam
1404: 	)
1405: {
1406: 	const UINT uItem  = static_cast<UINT>( LOWORD( wParam ) );
1407: 	const UINT uFlags = static_cast<UINT>( HIWORD( wParam ) );
1408: 	HMENU      hMenu  = reinterpret_cast<HMENU>( lParam );
1409: 
1410: 	VALID_TEST( (  0xFFFF == uFlags)
1411: 	         || (MF_POPUP != (MF_POPUP & uFlags))
1412: 	         || (IsValidMenu( hMenu ) && IsValidMenu( GetSubMenu( hMenu, uItem) ) ) );
1413: 
1414: 	return true;
1415: }//IsValidMenuSelectMessageParam
1416: 
1417: //*********************************************************
1418: // IsValidMenuString()
1419: //   メニュー項目 に指定できる 文字列 かどうか調べる。
1420: //   メニュー項目 の 文字列 として使えれば 真 を返す。
1421: //
1422: // const char *string
1423: //   メニュー項目に指定したい文字列
1424: //
1425: //*********************************************************
1426: bool // 妥当であれば 真 
1427: IsValidMenuString
1428: 	(
1429: 		const char *string // 文字列
1430: 	)
1431: {
1432: 	VALID_TEST( string );
1433: 	VALID_TEST( IsValidStringPtr( string ) );
1434: 
1435: 	return true;
1436: }//IsValidMenuString
1437: 
1438: //*********************************************************
1439: // IsValidNotifyMessageParam - WM_NOTIFY
1440: // 子ウィンドウから通知メッセージを受け取った
1441: // 返値の意味は通知メッセージの種類による
1442: //   int    wParam …… メッセージを通知してきたウィンドウの識別子
1443: //   NMHDR *lParam …… 通知メッセージ構造体へのポインタ
1444: //
1445: // 使用例:
1446: //	ASSERT( IsValidNotifyMessageParam( wParam, lParam ) );
1447: //
1448: //*********************************************************
1449: bool
1450: IsValidNotifyMessageParam
1451: 	(
1452: 		WPARAM wParam,
1453: 		LPARAM lParam
1454: 	)
1455: {
1456: 	NMHDR *nmhdr = reinterpret_cast<NMHDR *>( lParam );
1457: 	VALID_TEST( IsValidPtr( nmhdr, sizeof( *nmhdr ) ) );
1458: 	VALID_TEST( !nmhdr->hwndFrom || IsValidWindow( nmhdr->hwndFrom ) );
1459: 	VALID_TEST( wParam == nmhdr->idFrom );
1460: 
1461: 	return true;
1462: }//IsValidNotifyMessageParam
1463: 
1464: //*********************************************************
1465: // IsValidSetCursorMessageParam - WM_SETCURSOR
1466: // カーソルが移動するたびに呼び出される。
1467: // カーソルを変更する場合は 真 を返す。
1468: //   HWND  wParam   …… ウィンドウのハンドル
1469: //   LOWORD(lParam) …… HITTEST コード。
1470: //                     HTCLIENT, HTCAPTION, HTMENU, ...
1471: //   HIWORD(lParam) …… ??? Specifies the identifier of the mouse message. 
1472: //
1473: // 使用例:
1474: //	ASSERT( IsValidSetCursorMessageParam( wParam, lParam ) );
1475: //
1476: //*********************************************************
1477: bool
1478: IsValidSetCursorMessageParam
1479: 	(
1480: 		WPARAM wParam,
1481: 		LPARAM 
1482: 	)
1483: {
1484: 	VALID_TEST( IsValidWindow( reinterpret_cast<HWND>( wParam ) ) );
1485: 
1486: 	return true;
1487: }//IsValidSetCursorMessageParam
1488: 
1489: //*********************************************************
1490: // IsValidSystemCommandMessageParam - WM_SYSCOMMAND
1491: // システムメニューの項目が選択された
1492: // 返値の意味は選択された項目の種類による
1493: //   wParam               …… 選択されたメニュー項目の識別子
1494: //                           SC_CLOSE, SC_CONTEXTHELP, SC_DEFAULT, SC_HOTKEY, 
1495: //                           SC_KEYMENU, SC_MOVE, SC_MONITORPOWER, 
1496: //                           SC_MAXIMIZE, SC_MINIMIZE, SC_MOUSEMENU,
1497: //                           SC_NEXTWINDOW, SC_PREVWINDOW, SC_HSCROLL, SC_VSCROLL, 
1498: //                           SC_RESTORE, SC_SCREENSAVE, SC_SIZE, SC_TASKLIST, ...
1499: //   GET_X_LPARAM(lParam) …… カーソルのスクリーン x 座標
1500: //   GET_Y_LPARAM(lParam) …… カーソルのスクリーン y 座標
1501: //
1502: // 使用例:
1503: //	ASSERT(  IsValidSystemCommandMessageParam( wParam, lParam ) );
1504: //
1505: //*********************************************************
1506: bool
1507: IsValidSystemCommandMessageParam
1508: 	(
1509: 		WPARAM ,
1510: 		LPARAM 
1511: 	)
1512: {
1513: 	return true;
1514: }//IsValidSystemCommandMessageParam
1515: 
1516: //*********************************************************
1517: // IsValidWindow
1518: // ハンドル hWnd がウィンドウとして有効であれば真を返す
1519: //*********************************************************
1520: bool
1521: IsValidWindow
1522: 	(
1523: 		HWND hWnd
1524: 	)
1525: {
1526: 	VALID_TEST( hWnd );
1527: 	VALID_TEST( IsWindow( hWnd ) );
1528: 
1529: 	return true;
1530: }//IsValidWindow
1531: 
1532: //*********************************************************
1533: // IsValidWindowClass
1534: //*********************************************************
1535: bool
1536: IsValidWindowClass
1537: 	(
1538: 		const WNDCLASSEX *wc
1539: 	)
1540: {
1541: 	VALID_TEST( wc );
1542: 	VALID_TEST( IsValidReadPtr( wc, sizeof( *wc ) ) );
1543: 	VALID_TEST( sizeof( *wc ) == wc->cbSize );
1544: 	VALID_TEST( IsValidInstanceHandle( wc->hInstance ) );
1545: 	VALID_TEST( IsValidCodePtr( wc->lpfnWndProc ) );
1546: 	VALID_TEST( IsValidStringPtr( wc->lpszClassName ) );
1547: 	VALID_TEST( !wc->lpszMenuName || IsValidResourceName( wc->lpszMenuName ) );
1548: 	VALID_TEST( !wc->hIcon || IsValidIconHandle( wc->hIcon ) );
1549: 	VALID_TEST( !wc->hIconSm || IsValidIconHandle( wc->hIconSm ) );
1550: 	VALID_TEST( !wc->hCursor || IsValidCursorHandle( wc->hCursor ) );
1551: 
1552: 	return true;
1553: }//IsValidWindowClass
1554: 
1555: //*********************************************************
1556: // IsValidWindowPosChangingMessageParam - WM_WINDOWPOSCHANGING
1557: // ウィンドウの位置情報が変更されようとしている
1558: // 常に 0L を返す
1559: //   WINDOWPOS *lParam …… WINDOWPOS 構造体へのポインタ
1560: //
1561: // 使用例:
1562: //	ASSERT( IsValidWindowPosChangingMessageParam( wParam, lParam ) );
1563: //
1564: //*********************************************************
1565: bool
1566: IsValidWindowPosChangingMessageParam
1567: 	(
1568: 		WPARAM ,
1569: 		LPARAM lParam
1570: 	)
1571: {
1572: 	WINDOWPOS *wp = reinterpret_cast<WINDOWPOS *>( lParam );
1573: 	VALID_TEST( IsValidPtr( wp, sizeof( *wp ) ) );
1574: 
1575: 	return true;
1576: }//IsValidWindowPosChangingMessageParam
1577: 
1578: //*********************************************************
1579: // IsWindowNotifyMessageParam
1580: //*********************************************************
1581: bool
1582: IsWindowNotifyMessageParam
1583: 	(
1584: 		HWND   hWnd,
1585: 		LPARAM lParam
1586: 	)
1587: {
1588: 	// パラメタの仮定
1589: 	ASSERT( IsValidWindow( hWnd ) );
1590: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof( NMHDR ) ) );
1591: 
1592: 	const NMHDR *nmhdr = GetNotifyMessageParam( lParam );
1593: 
1594: 	if ( nmhdr->hwndFrom != hWnd )
1595: 		return false;
1596: 
1597: 	if ( nmhdr->idFrom != (UINT)GetDlgCtrlID( hWnd ) )
1598: 		return false;
1599: 
1600: 	return true;
1601: }//IsWindowNotifyMessageParam
1602: 
1603: //*********************************************************
1604: // IsWindowTopmost
1605: // ウィンドウ hWnd が最前面ウィンドウであれば真を返す
1606: //*********************************************************
1607: bool
1608: IsWindowTopmost
1609: 	(
1610: 		HWND hWnd
1611: 	)
1612: {
1613: 	// パラメタの仮定
1614: 	ASSERT( IsValidWindow( hWnd ) );
1615: 
1616: 	const DWORD dwWindowExStyle = GetWindowExStyle( hWnd );
1617: 	return WS_EX_TOPMOST == (WS_EX_TOPMOST & dwWindowExStyle);
1618: }//IsWindowTopmost
1619: 
1620: 
1621: //------------------------------------------------------------------------------------------------------------------
1622: // j
1623: //------------------------------------------------------------------------------------------------------------------
1624: 
1625: //------------------------------------------------------------------------------------------------------------------
1626: // k
1627: //------------------------------------------------------------------------------------------------------------------
1628: 
1629: //------------------------------------------------------------------------------------------------------------------
1630: // l
1631: //------------------------------------------------------------------------------------------------------------------
1632: 
1633: //------------------------------------------------------------------------------------------------------------------
1634: // m
1635: //------------------------------------------------------------------------------------------------------------------
1636: //*********************************************************
1637: // MakeNotifyStruct
1638: //*********************************************************
1639: bool
1640: MakeNotifyStruct
1641: 	(
1642: 		NMHDR *hdr,
1643: 		HWND   hWnd,
1644: 		UINT   code
1645: 	)
1646: {
1647: 	// パラメタの仮定
1648: 	ASSERT( IsValidWindow( hWnd ) );
1649: 	ASSERT( IsValidPtr( hdr, sizeof( *hdr ) ) );
1650: 
1651: 	memzero( hdr, sizeof( *hdr ) );
1652: 	hdr->code     = code;
1653: 	hdr->hwndFrom = hWnd;
1654: 	hdr->idFrom   = GetDlgCtrlID( hWnd );
1655: 	return true;
1656: }//MakeNotifyStruct
1657: 
1658: //*********************************************************
1659: // MakeWindowClass
1660: //*********************************************************
1661: bool
1662: MakeWindowClass
1663: 	(
1664: 		      WNDCLASSEX *wc,
1665: 		      HINSTANCE   hInstance,
1666: 		      WNDPROC     WndProc,
1667: 		const char      *ClassName,
1668: 		const char      *MenuName,
1669: 		      UINT        style
1670: 	)
1671: {
1672: 	// パラメタの仮定
1673: 	ASSERT( IsValidPtr( wc, sizeof( *wc ) ) );
1674: 	ASSERT( IsValidInstanceHandle( hInstance ) );
1675: 	ASSERT( IsValidCodePtr( WndProc ) );
1676: 	ASSERT( IsValidStringPtr( ClassName ) );
1677: 	ASSERT( !MenuName || IsValidResourceName( MenuName ) );
1678: 	
1679: 	// ウィンドウクラスの登録
1680: 	memzero( wc, sizeof( *wc ) ); 
1681: 	wc->cbSize        = sizeof( *wc ); // 構造体のサイズ
1682: 	wc->hInstance     = hInstance;     // インスタンス
1683: 	wc->lpszClassName = ClassName;     // クラス名
1684: 	wc->lpfnWndProc   = WndProc;       // ウィンドウ・メッセージ関数
1685: 	wc->style         = style;         // スタイル
1686: 	wc->lpszMenuName  = MenuName;      // メニュー
1687: 	wc->hbrBackground = null;          // 背景色
1688: 	wc->hIcon         = null;          // 大きいアイコン
1689: 	wc->hIconSm       = null;          // 小さいアイコン
1690: 	wc->hCursor       = null;          // カーソル
1691: 	wc->cbClsExtra    = 0;             //
1692: 	wc->cbWndExtra    = 0;             //
1693: 
1694: 	ASSERT( IsValidWindowClass( wc ) );
1695: 	return true;
1696: }//MakeWindowClass
1697: 
1698: //*********************************************************
1699: // MaximizeWindow
1700: // ウィンドウ hWnd を最大化する
1701: // ウィンドウが以前に表示されていた場合には非 0 が返る
1702: // ウィンドウが以前に非表示にされていた場合には 0 が返る
1703: //*********************************************************
1704: bool
1705: MaximizeWindow
1706: 	(
1707: 		HWND hWnd
1708: 	)
1709: {
1710: 	// パラメタの仮定
1711: 	ASSERT( IsValidWindow( hWnd ) );
1712: 
1713: 	return !! ShowWindow( hWnd, SW_MAXIMIZE );
1714: }//MaximizeWindow
1715: 
1716: //*********************************************************
1717: // Menu_AppendSeparator()
1718: //   メニューの末尾に 区切り線 を追加する。
1719: //   区切り線の追加に成功すれば 真 を返す。
1720: //
1721: // HMENU hMenu
1722: //   区切り線を追加する メニュー のハンドル
1723: //
1724: //*********************************************************
1725: bool // 成功すれば 真
1726: Menu_AppendSeparator
1727: 	(
1728: 		HMENU hMenu // 区切り線を追加するメニュー
1729: 	)
1730: {
1731: 	// パラメタの仮定
1732: 	ASSERT( IsValidMenu( hMenu ) );
1733: 
1734: 	return !! AppendMenu( hMenu, MFT_SEPARATOR, 0, "" );
1735: }//Menu_AppendSeparator
1736: 
1737: //*********************************************************
1738: // Menu_CheckItem()
1739: //   メニュー項目 の チェック状態 を変更する。
1740: //   変更前のチェック状態 (MF_CHECKED or MF_UNCHECKED) を返す。
1741: //   指定された メニュー項目 が無い場合は 0xFFFFFFFF を返す。
1742: //
1743: // HMENU hMenu
1744: //   変更対象のメニュー項目を持つ 親メニュー のハンドル
1745: //
1746: // UINT uID
1747: //   flags が MF_BYCOMMAND の場合
1748: //     チェック状態を変更するメニュー項目の 項目識別子
1749: //   flags が MF_BYPOSITION の場合
1750: //     チェック状態を変更するメニュー項目の 0 開始位置
1751: //
1752: // UINT flags
1753: //   uID の意味を指定する。
1754: //   MF_BYCOMMAND or MF_BYPOSITION
1755: //
1756: // bool bCheck
1757: //   メニュー項目 にチェックをする場合は 真 を指定する。
1758: //
1759: //*********************************************************
1760: DWORD // 直前の状態
1761: Menu_CheckItem
1762: 	(
1763: 		HMENU hMenu, // 親メニューのハンドル
1764: 		UINT  uID,   // メニュー項目の 識別子 or 位置
1765: 		UINT  flags, // MF_BYCOMMAND or MF_BYPOSITION
1766: 		bool  bCheck // チェックをする場合は 真
1767: 	)
1768: {
1769: 	// パラメタの仮定
1770: 	ASSERT( IsValidMenu( hMenu ) );
1771: 	ASSERT( INVALID_MENUITEMID != uID );
1772: 	ASSERT( (MF_BYCOMMAND  == flags)
1773: 	     || (MF_BYPOSITION == flags) );
1774: 
1775: 	const UINT uCheck = ( bCheck ? MF_CHECKED : MF_UNCHECKED );
1776: 	return CheckMenuItem( hMenu, uID, flags | uCheck );
1777: }//Menu_CheckItem
1778: 
1779: //*********************************************************
1780: // Menu_EnableItem()
1781: //   メニュー項目 の 有効・無効 を変更する。
1782: //   変更前の 有効・無効 を返す。
1783: //   指定された メニュー項目 が無い場合は 偽 を返す。
1784: //
1785: // HMENU hMenu
1786: //   変更対象のメニュー項目を持つ 親メニュー のハンドル
1787: //
1788: // UINT uID
1789: //   flags が MF_BYCOMMAND の場合
1790: //     メニュー項目の 項目識別子
1791: //   flags が MF_BYPOSITION の場合
1792: //     メニュー項目の 0 開始位置
1793: //
1794: // UINT flags
1795: //   uID の意味を指定する。
1796: //   MF_BYCOMMAND or MF_BYPOSITION
1797: //
1798: // bool bEnable
1799: //   メニュー項目 を 有効 にする場合は 真 を指定する。
1800: //
1801: //*********************************************************
1802: bool // 直前の状態
1803: Menu_EnableItem
1804: 	(
1805: 		HMENU hMenu,  // 親メニューのハンドル
1806: 		UINT  uID,    // メニュー項目の 識別子 or 位置
1807: 		UINT  flags,  // MF_BYCOMMAND or MF_BYPOSITION
1808: 		bool  bEnable // 有効 にする場合は 真
1809: 	)
1810: {
1811: 	// パラメタの仮定
1812: 	ASSERT( IsValidMenu( hMenu ) );
1813: 	ASSERT( INVALID_MENUITEMID != uID );
1814: 	ASSERT( (MF_BYCOMMAND  == flags)
1815: 	     || (MF_BYPOSITION == flags) );
1816: 
1817: 	const UINT uEnable = ( bEnable ? MF_ENABLED : MF_GRAYED );
1818: 	return MF_ENABLED == EnableMenuItem( hMenu, uID, flags | uEnable );
1819: }//Menu_EnableItem
1820: 
1821: //*********************************************************
1822: // Menu_InsertSeparator()
1823: //   メニューに 区切り線 を 挿入 する。
1824: //   区切り線の挿入に成功すれば 真 を返す。
1825: //
1826: // HMENU hMenu
1827: //   区切り線を挿入する メニュー のハンドル
1828: //
1829: // UINT uID
1830: //   区切り線を挿入する位置の直前にある メニュー項目 を指定します。
1831: //   flags が MF_BYCOMMAND の場合
1832: //     メニュー項目の 項目識別子
1833: //   flags が MF_BYPOSITION の場合
1834: //     メニュー項目の 0 開始位置
1835: //
1836: // UINT flags
1837: //   uID の意味を指定する。
1838: //   MF_BYCOMMAND or MF_BYPOSITION
1839: //
1840: //*********************************************************
1841: bool // 成功すれば 真
1842: Menu_InsertSeparator
1843: 	(
1844: 		HMENU hMenu, // 区切り線を挿入するメニュー
1845: 		UINT  uID,   // 挿入位置直前の メニュー項目
1846: 		UINT  flags  // MF_BYCOMMAND or MF_BYPOSITION
1847: 	)
1848: {
1849: 	// パラメタの仮定
1850: 	ASSERT( IsValidMenu( hMenu ) );
1851: 	ASSERT( INVALID_MENUITEMID != uID );
1852: 	ASSERT( (MF_BYCOMMAND  == flags)
1853: 	     || (MF_BYPOSITION == flags) );
1854: 
1855: 	return !! InsertMenu( hMenu, uID, MFT_SEPARATOR | flags, 0, "" );
1856: }//Menu_InsertSeparator
1857: 
1858: //*********************************************************
1859: // MinimizeWindow
1860: // ウィンドウ hWnd を最小化する
1861: // Z順位が次のトップレベルウィンドウをアクティブにする
1862: // ウィンドウが以前に表示されていた場合には非 0 が返る
1863: // ウィンドウが以前に非表示にされていた場合には 0 が返る
1864: //*********************************************************
1865: bool
1866: MinimizeWindow
1867: 	(
1868: 		HWND hWnd
1869: 	)
1870: {
1871: 	// パラメタの仮定
1872: 	ASSERT( IsValidWindow( hWnd ) );
1873: 
1874: 	return !! ShowWindow( hWnd, SW_MINIMIZE );
1875: }//MinimizeWindow
1876: 
1877: 
1878: //------------------------------------------------------------------------------------------------------------------
1879: // n
1880: //------------------------------------------------------------------------------------------------------------------
1881: 
1882: //------------------------------------------------------------------------------------------------------------------
1883: // o
1884: //------------------------------------------------------------------------------------------------------------------
1885: 
1886: //------------------------------------------------------------------------------------------------------------------
1887: // p
1888: //------------------------------------------------------------------------------------------------------------------
1889: //*********************************************************
1890: // PopupMenu()
1891: //   メニューをポップアップ表示する。
1892: //   関数が成功すれば 真 を返す。
1893: //
1894: // HWND hwndOwner
1895: //   メッセージを受け取る ウィンドウ のハンドル
1896: //
1897: // HMENU hMenuPopup
1898: //   表示するメニューのハンドル
1899: //
1900: // const POINT *pt
1901: //   メニューを表示する スクリーン座標
1902: //
1903: // UINT flags
1904: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
1905: //
1906: // [参照]
1907: // PopupMenu()
1908: // PopupMenuEx()
1909: // PopupMenuCursorPos()
1910: // PopupMenuCursorPosEx()
1911: // PopupSubMenu()
1912: // PopupSubMenuEx()
1913: // PopupSubMenuCursorPos()
1914: // PopupSubMenuCursorPosEx()
1915: //
1916: //*********************************************************
1917: bool // 成功すれば 真
1918: PopupMenu
1919: 	(
1920: 		      HWND   hwndOwner,  // メッセージを受け取る ウィンドウ
1921: 		      HMENU  hMenuPopup, // 表示するメニュー
1922: 		const POINT *pt,         // メニューを表示する スクリーン座標
1923: 		      UINT   flags       // 関数オプションの組み合わせ
1924: 	)
1925: {
1926: 	// パラメタの仮定
1927: 	ASSERT( IsValidWindow( hwndOwner ) );
1928: 	ASSERT( IsValidMenu( hMenuPopup ) );
1929: 	ASSERT( IsValidReadPtr( pt, sizeof( *pt ) ) );
1930: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
1931: 	
1932: 	return PopupMenuEx
1933: 		(
1934: 			hwndOwner,
1935: 			hMenuPopup, 
1936: 			pt,
1937: 			flags,
1938: 			null
1939: 		);
1940: }//PopupMenu
1941: 
1942: //*********************************************************
1943: // PopupMenuEx()
1944: //   メニューをポップアップ表示する。
1945: //   関数が成功すれば 真 を返す。
1946: //
1947: // HWND hwndOwner
1948: //   メッセージを受け取る ウィンドウ のハンドル
1949: //
1950: // HMENU hMenuPopup
1951: //   表示するメニューのハンドル
1952: //
1953: // const POINT *pt
1954: //   メニューを表示する スクリーン座標
1955: //
1956: // UINT flags
1957: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
1958: //
1959: // const RECT *rcClip
1960: //   メニューのオーバーラップを回避する領域を指定する。
1961: //   そのような領域がない場合は null を指定する。
1962: //
1963: // [参照]
1964: // PopupMenu()
1965: // PopupMenuEx()
1966: // PopupMenuCursorPos()
1967: // PopupMenuCursorPosEx()
1968: // PopupSubMenu()
1969: // PopupSubMenuEx()
1970: // PopupSubMenuCursorPos()
1971: // PopupSubMenuCursorPosEx()
1972: //
1973: //*********************************************************
1974: bool // 成功すれば 真
1975: PopupMenuEx
1976: 	(
1977: 		      HWND   hwndOwner,  // メッセージを受け取る ウィンドウ
1978: 		      HMENU  hMenuPopup, // 表示するメニュー
1979: 		const POINT *pt,         // メニューを表示する スクリーン座標
1980: 		      UINT   flags,      // 関数オプションの組み合わせ
1981: 		const RECT  *rcClip      // オーバーラップを回避する領域
1982: 	)
1983: {
1984: 	// パラメタの仮定
1985: 	ASSERT( IsValidWindow( hwndOwner ) );
1986: 	ASSERT( IsValidMenu( hMenuPopup ) );
1987: 	ASSERT( IsValidReadPtr( pt, sizeof( *pt ) ) );
1988: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
1989: 	ASSERT( !rcClip || IsValidRect( rcClip ) );
1990: 	
1991: 	// ウィンドウをフォアグラウンドにしないとキーボードでの項目選択に失敗する場合がある。
1992: 	SetForegroundWindow( hwndOwner );
1993: 
1994: 	// 
1995: 	if ( !rcClip )
1996: 	{
1997: 		// 範囲制限なし
1998: 		return !! TrackPopupMenuEx
1999: 			(
2000: 				hMenuPopup,
2001: 				flags, 
2002: 				pt->x,
2003: 				pt->y, 
2004: 				hwndOwner,
2005: 				null
2006: 			);
2007: 	}
2008: 	else
2009: 	{
2010: 		// 範囲制限あり
2011: 		TPMPARAMS tpm;
2012: 		memzero( &tpm, sizeof( tpm ) );
2013: 		tpm.cbSize = sizeof( tpm );
2014: 		VERIFY( CopyRect( &tpm.rcExclude, rcClip ) );
2015: 		return !! TrackPopupMenuEx
2016: 			(
2017: 				hMenuPopup, 
2018: 				flags, 
2019: 				pt->x, 
2020: 				pt->y,
2021: 				hwndOwner, 
2022: 				&tpm 
2023: 			);
2024: 	}
2025: }//PopupMenuEx
2026: 
2027: //*********************************************************
2028: // PopupMenuCursorPos()
2029: //   カーソル位置 にメニューをポップアップ表示する。
2030: //   関数が成功すれば 真 を返す。
2031: //
2032: // HWND hwndOwner
2033: //   メッセージを受け取る ウィンドウ のハンドル
2034: //
2035: // HMENU hMenuPopup
2036: //   表示するメニューのハンドル
2037: //
2038: // UINT flags
2039: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
2040: //
2041: // [参照]
2042: // PopupMenu()
2043: // PopupMenuEx()
2044: // PopupMenuCursorPos()
2045: // PopupMenuCursorPosEx()
2046: // PopupSubMenu()
2047: // PopupSubMenuEx()
2048: // PopupSubMenuCursorPos()
2049: // PopupSubMenuCursorPosEx()
2050: //
2051: //*********************************************************
2052: bool // 成功すれば 真
2053: PopupMenuCursorPos
2054: 	(
2055: 		HWND  hwndOwner,  // メッセージを受け取る ウィンドウ
2056: 		HMENU hMenuPopup, // 表示するメニュー
2057: 		UINT  flags       // 関数オプションの組み合わせ
2058: 	)
2059: {
2060: 	// パラメタの仮定
2061: 	ASSERT( IsValidWindow( hwndOwner ) );
2062: 	ASSERT( IsValidMenu( hMenuPopup ) );
2063: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
2064: 	
2065: 	return PopupMenuCursorPosEx
2066: 		(
2067: 			hwndOwner, 
2068: 			hMenuPopup, 
2069: 			flags, 
2070: 			null 
2071: 		);
2072: }//PopupMenuCursorPos
2073: 
2074: //*********************************************************
2075: // PopupMenuCursorPosEx()
2076: //   カーソル位置 にメニューをポップアップ表示する。
2077: //   関数が成功すれば 真 を返す。
2078: //
2079: // HWND hwndOwner
2080: //   メッセージを受け取る ウィンドウ のハンドル
2081: //
2082: // HMENU hMenuPopup
2083: //   表示するメニューのハンドル
2084: //
2085: // UINT flags
2086: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
2087: //
2088: // const RECT *rcClip
2089: //   メニューのオーバーラップを回避する領域を指定する。
2090: //   そのような領域がない場合は null を指定する。
2091: //
2092: // [参照]
2093: // PopupMenu()
2094: // PopupMenuEx()
2095: // PopupMenuCursorPos()
2096: // PopupMenuCursorPosEx()
2097: // PopupSubMenu()
2098: // PopupSubMenuEx()
2099: // PopupSubMenuCursorPos()
2100: // PopupSubMenuCursorPosEx()
2101: //
2102: //*********************************************************
2103: bool // 成功すれば 真
2104: PopupMenuCursorPosEx
2105: 	(
2106: 		      HWND   hwndOwner,  // メッセージを受け取る ウィンドウ
2107: 		      HMENU  hMenuPopup, // 表示するメニュー
2108: 		      UINT   flags,      // 関数オプションの組み合わせ
2109: 		const RECT  *rcClip      // オーバーラップを回避する領域
2110: 	)
2111: {
2112: 	// パラメタの仮定
2113: 	ASSERT( IsValidWindow( hwndOwner ) );
2114: 	ASSERT( IsValidMenu( hMenuPopup ) );
2115: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
2116: 	ASSERT( !rcClip || IsValidRect( rcClip ) );
2117: 	
2118: 	// メニューの表示位置を取得する。
2119: 	POINT ptCursor;
2120: 	if ( !GetCursorPos( &ptCursor ) )
2121: 	{
2122: 		return false; // 関数が失敗した場合は 偽 を返す。
2123: 	}
2124: 		
2125: 	return PopupMenuEx
2126: 		(
2127: 			hwndOwner,
2128: 			hMenuPopup,
2129: 			&ptCursor,
2130: 			flags,
2131: 			rcClip
2132: 		);
2133: }//PopupMenuCursorPosEx
2134: 
2135: //*********************************************************
2136: // PopupSubMenu()
2137: //   メニュー name の位置 pos にある サブメニュー をポップアップ表示する。
2138: //   関数が成功すれば 真 を返す。
2139: //
2140: // HINSTANCE hInstance
2141: //   メニューリソース を持つ モジュール
2142: //
2143: // const char *name
2144: //   メニュー名
2145: //
2146: // int pos
2147: //   サブメニューの 0 開始位置
2148: //
2149: // HWND hwndOwner
2150: //   メッセージを受け取る ウィンドウ のハンドル
2151: //
2152: // const POINT *pt
2153: //   メニューを表示する スクリーン座標
2154: //
2155: // UINT flags
2156: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
2157: //
2158: // [参照]
2159: // PopupMenu()
2160: // PopupMenuEx()
2161: // PopupMenuCursorPos()
2162: // PopupMenuCursorPosEx()
2163: // PopupSubMenu()
2164: // PopupSubMenuEx()
2165: // PopupSubMenuCursorPos()
2166: // PopupSubMenuCursorPosEx()
2167: //
2168: //*********************************************************
2169: bool // 成功すれば 真
2170: PopupSubMenu
2171: 	(
2172: 		      HINSTANCE  hInstance, // メニューリソースを持つモジュール
2173: 		const char     *name,      // メニュー名
2174: 		      int        pos,       // サブメニューの 0 開始位置
2175: 		      HWND       hwndOwner, // メッセージを受け取る ウィンドウ
2176: 		const POINT     *pt,        // メニューを表示する スクリーン座標
2177: 		      UINT       flags      // 関数オプションの組み合わせ
2178: 	)
2179: {
2180: 	// パラメタの仮定
2181: 	ASSERT( IsValidInstanceHandle( hInstance ) );
2182: 	ASSERT( IsValidResourceName( name ) );
2183: 	ASSERT( 0 <= pos );
2184: 	ASSERT( IsValidWindow( hwndOwner ) );
2185: 	ASSERT( IsValidReadPtr( pt, sizeof( *pt ) ) );
2186: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
2187: 
2188: 	return PopupSubMenuEx
2189: 		(
2190: 			hInstance, 
2191: 			name,
2192: 			pos,
2193: 			hwndOwner,
2194: 			pt,
2195: 			flags, 
2196: 			null
2197: 		);
2198: }//PopupSubMenu
2199: 
2200: //*********************************************************
2201: // PopupSubMenuEx()
2202: //   メニュー name の位置 pos にある サブメニュー をポップアップ表示する。
2203: //   関数が成功すれば 真 を返す。
2204: //
2205: // HINSTANCE hInstance
2206: //   メニューリソース を持つ モジュール
2207: //
2208: // const char *name
2209: //   メニュー名
2210: //
2211: // int pos
2212: //   サブメニューの 0 開始位置
2213: //
2214: // HWND hwndOwner
2215: //   メッセージを受け取る ウィンドウ のハンドル
2216: //
2217: // const POINT *pt
2218: //   メニューを表示する スクリーン座標
2219: //
2220: // UINT flags
2221: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
2222: //
2223: // const RECT *rcClip
2224: //   メニューのオーバーラップを回避する領域を指定する。
2225: //   そのような領域がない場合は null を指定する。
2226: //
2227: // [参照]
2228: // PopupMenu()
2229: // PopupMenuEx()
2230: // PopupMenuCursorPos()
2231: // PopupMenuCursorPosEx()
2232: // PopupSubMenu()
2233: // PopupSubMenuEx()
2234: // PopupSubMenuCursorPos()
2235: // PopupSubMenuCursorPosEx()
2236: //
2237: //*********************************************************
2238: bool // 成功すれば 真
2239: PopupSubMenuEx
2240: 	(
2241: 		      HINSTANCE  hInstance, // メニューリソースを持つモジュール
2242: 		const char     *name,      // メニュー名
2243: 		      int        pos,       // サブメニューの 0 開始位置
2244: 		      HWND       hwndOwner, // メッセージを受け取る ウィンドウ
2245: 		const POINT     *pt,        // メニューを表示する スクリーン座標
2246: 		      UINT       flags,     // 関数オプションの組み合わせ
2247: 		const RECT      *rcClip     // オーバーラップを回避する領域
2248: 	)
2249: {
2250: 	// パラメタの仮定
2251: 	ASSERT( IsValidInstanceHandle( hInstance ) );
2252: 	ASSERT( IsValidResourceName( name ) );
2253: 	ASSERT( 0 <= pos );
2254: 	ASSERT( IsValidWindow( hwndOwner ) );
2255: 	ASSERT( IsValidReadPtr( pt, sizeof( *pt ) ) );
2256: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
2257: 	ASSERT( !rcClip || IsValidRect( rcClip ) );
2258: 
2259: 	// トップレベルメニュー のロード
2260: 	HMENU hTopMenu = LoadMenu( hInstance, name );
2261: 	if ( !hTopMenu )
2262: 	{
2263: 		return false; // トップレベルメニュー のロードに失敗
2264: 	}
2265: 
2266: 	// サブメニュー のロード
2267: 	HMENU hMenuPopup = GetSubMenu( hTopMenu, pos );
2268: 	if ( !hMenuPopup )
2269: 	{
2270: 		VERIFY( DestroyMenu( hTopMenu ) );
2271: 		return false; // サブメニュー のロードに失敗
2272: 	}
2273: 
2274: 	//
2275: 	ASSERT( IsValidMenu( hTopMenu ) );
2276: 	ASSERT( IsValidMenu( hMenuPopup ) );
2277: 	ASSERT( pos < GetMenuItemCount( hTopMenu ) );
2278: 
2279: 	//
2280: 	const bool bSuccess = PopupMenuEx
2281: 		(
2282: 			hwndOwner, 
2283: 			hMenuPopup, 
2284: 			pt,
2285: 			flags, 
2286: 			rcClip
2287: 		);
2288: 
2289: 	//
2290: 	VERIFY( DestroyMenu( hTopMenu ) );
2291: 
2292: 	return bSuccess;
2293: }//PopupSubMenuEx
2294: 
2295: //*********************************************************
2296: // PopupSubMenuCursorPos()
2297: //   メニュー name の位置 pos にある サブメニューを カーソル位置 にポップアップ表示する。
2298: //   関数が成功すれば 真 を返す。
2299: //
2300: // HINSTANCE hInstance
2301: //   メニューリソース を持つ モジュール
2302: //
2303: // const char *name
2304: //   メニュー名
2305: //
2306: // int pos
2307: //   サブメニューの 0 開始位置
2308: //
2309: // HWND hwndOwner
2310: //   メッセージを受け取る ウィンドウ のハンドル
2311: //
2312: // UINT flags
2313: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
2314: //
2315: // [参照]
2316: // PopupMenu()
2317: // PopupMenuEx()
2318: // PopupMenuCursorPos()
2319: // PopupMenuCursorPosEx()
2320: // PopupSubMenu()
2321: // PopupSubMenuEx()
2322: // PopupSubMenuCursorPos()
2323: // PopupSubMenuCursorPosEx()
2324: //
2325: //*********************************************************
2326: bool // 成功すれば 真
2327: PopupSubMenuCursorPos
2328: 	(
2329: 		      HINSTANCE  hInstance, // メニューリソースを持つモジュール
2330: 		const char     *name,      // メニュー名
2331: 		      int        pos,       // サブメニューの 0 開始位置
2332: 		      HWND       hwndOwner, // メッセージを受け取る ウィンドウ
2333: 		      UINT       flags      // 関数オプションの組み合わせ
2334: 	)
2335: {
2336: 	// パラメタの仮定
2337: 	ASSERT( IsValidInstanceHandle( hInstance ) );
2338: 	ASSERT( IsValidResourceName( name ) );
2339: 	ASSERT( 0 <= pos );
2340: 	ASSERT( IsValidWindow( hwndOwner ) );
2341: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
2342: 
2343: 	return PopupSubMenuCursorPosEx
2344: 		(
2345: 			hInstance,
2346: 			name, 
2347: 			pos,
2348: 			hwndOwner, 
2349: 			flags,
2350: 			null
2351: 		);
2352: }//PopupSubMenuCursorPos
2353: 
2354: //*********************************************************
2355: // PopupSubMenuCursorPosEx()
2356: //   メニュー name の位置 pos にある サブメニュー を カーソル位置 にポップアップ表示する。
2357: //   関数が成功すれば 真 を返す。
2358: //
2359: // HINSTANCE hInstance
2360: //   メニューリソース を持つ モジュール
2361: //
2362: // const char *name
2363: //   メニュー名
2364: //
2365: // int pos
2366: //   サブメニューの 0 開始位置
2367: //
2368: // HWND hwndOwner
2369: //   メッセージを受け取る ウィンドウ のハンドル
2370: //
2371: // UINT flags
2372: //   TPM_RIGHTBUTTON, TPM_RECURSE, TPM_VERTICAL, ...
2373: //
2374: // const RECT *rcClip
2375: //   メニューのオーバーラップを回避する領域を指定する。
2376: //   そのような領域がない場合は null を指定する。
2377: //
2378: // [参照]
2379: // PopupMenu()
2380: // PopupMenuEx()
2381: // PopupMenuCursorPos()
2382: // PopupMenuCursorPosEx()
2383: // PopupSubMenu()
2384: // PopupSubMenuEx()
2385: // PopupSubMenuCursorPos()
2386: // PopupSubMenuCursorPosEx()
2387: //
2388: //*********************************************************
2389: bool // 成功すれば 真
2390: PopupSubMenuCursorPosEx
2391: 	(
2392: 		      HINSTANCE  hInstance, // メニューリソースを持つモジュール
2393: 		const char     *name,      // メニュー名
2394: 		      int        pos,       // サブメニューの 0 開始位置
2395: 		      HWND       hwndOwner, // メッセージを受け取る ウィンドウ
2396: 		      UINT       flags,     // 関数オプションの組み合わせ
2397: 		const RECT      *rcClip     // オーバーラップを回避する領域
2398: 	)
2399: {
2400: 	// パラメタの仮定
2401: 	ASSERT( IsValidInstanceHandle( hInstance ) );
2402: 	ASSERT( IsValidResourceName( name ) );
2403: 	ASSERT( 0 <= pos );
2404: 	ASSERT( IsValidWindow( hwndOwner ) );
2405: 	ASSERT( TPM_RETURNCMD != (TPM_RETURNCMD & flags) );
2406: 	ASSERT( !rcClip || IsValidRect( rcClip ) );
2407: 
2408: 	// メニューの表示位置を取得する。
2409: 	POINT ptCursor;
2410: 	if ( !GetCursorPos( &ptCursor ) )
2411: 	{
2412: 		return false; // 関数が失敗した場合は 偽 を返す。
2413: 	}
2414: 
2415: 	return PopupSubMenuEx
2416: 		(
2417: 			hInstance,
2418: 			name, 
2419: 			pos,
2420: 			hwndOwner,
2421: 			&ptCursor,
2422: 			flags,
2423: 			rcClip
2424: 		);
2425: }//PopupSubMenuCursorPosEx
2426: 
2427: 
2428: //------------------------------------------------------------------------------------------------------------------
2429: // q
2430: //------------------------------------------------------------------------------------------------------------------
2431: 
2432: //------------------------------------------------------------------------------------------------------------------
2433: // r
2434: //------------------------------------------------------------------------------------------------------------------
2435: //*********************************************************
2436: // ResetWindowTopmost
2437: //*********************************************************
2438: bool
2439: ResetWindowTopmost
2440: 	(
2441: 		HWND hWnd
2442: 	)
2443: {
2444: 	// パラメタの仮定
2445: 	ASSERT( IsValidWindow( hWnd ) );
2446: 
2447: 	return !! SetWindowPos
2448: 		(
2449: 			hWnd,
2450: 			HWND_NOTOPMOST,
2451: 			0,
2452: 			0,
2453: 			0,
2454: 			0,
2455: 			SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOSENDCHANGING
2456: 		);
2457: }//ResetWindowTopmost
2458: 
2459: //*********************************************************
2460: // RestoreWindow
2461: // ウィンドウ hWnd をアクティブにして元の位置とサイズに復元する
2462: // ウィンドウが以前に表示されていた場合には非 0 が返る
2463: // ウィンドウが以前に非表示にされていた場合には 0 が返る
2464: //*********************************************************
2465: bool
2466: RestoreWindow
2467: 	(
2468: 		HWND hWnd
2469: 	)
2470: {
2471: 	// パラメタの仮定
2472: 	ASSERT( IsValidWindow( hWnd ) );
2473: 
2474: 	return !! ShowWindow( hWnd, SW_RESTORE );
2475: }//RestoreWindow
2476: 
2477: 
2478: //------------------------------------------------------------------------------------------------------------------
2479: // s
2480: //------------------------------------------------------------------------------------------------------------------
2481: //*********************************************************
2482: // ScreenRectToClientRect
2483: // スクリーン座標の矩形 rc をクライアント座標に変換する
2484: //*********************************************************
2485: bool
2486: ScreenRectToClientRect
2487: 	(
2488: 		HWND  hWnd,
2489: 		RECT *rc
2490: 	)
2491: {
2492: 	// パラメタの仮定
2493: 	ASSERT( IsValidWindow( hWnd ) );
2494: 	ASSERT( IsValidPtr( rc, sizeof( *rc ) ) );
2495: 	ASSERT( IsValidRect( rc ) );
2496: 
2497: 	POINT pt = { 0, 0 };
2498: 	if ( !ScreenToClient( hWnd, &pt ) )
2499: 		return false;
2500: 
2501: 	VERIFY( OffsetRect( rc, pt.x , pt.y ) );
2502: 	ASSERT( IsValidRect( rc ) );
2503: 	return true;
2504: }//ScreenRectToClientRect
2505: 
2506: //*********************************************************
2507: // ScreenToWindow
2508: // スクリーン座標 pt をウィンドウ座標に変換する
2509: //*********************************************************
2510: bool
2511: ScreenToWindow
2512: 	(
2513: 		HWND   hWnd,
2514: 		POINT *pt
2515: 	)
2516: {
2517: 	// パラメタの仮定
2518: 	ASSERT( IsValidWindow( hWnd ) );
2519: 	ASSERT( IsValidPtr( pt, sizeof( *pt ) ) );
2520: 
2521: 	POINT ptWindow;
2522: 	VERIFY( GetWindowPoint( hWnd, &ptWindow ) );
2523: 	VERIFY( OffsetPoint( pt, -ptWindow.x, -ptWindow.y ) );
2524: 	return true;
2525: }//ScreenToWindow
2526: 
2527: //*********************************************************
2528: // SendNotifyCommand
2529: //*********************************************************
2530: LRESULT
2531: SendNotifyCommand
2532: 	(
2533: 		HWND hCtrl,
2534: 		WORD wNotifyCode
2535: 	)
2536: {
2537: 	// パラメタの仮定
2538: 	ASSERT( IsValidWindow( hCtrl ) );
2539: 	ASSERT( IsValidWindow( GetParent(hCtrl) ) );
2540: 	ASSERT( 1 < (WORD)GetWindowID( hCtrl ) ); // 0 〜 1 はメニューやホットキーを表す
2541: 
2542: 	WORD wID     = (WORD)GetWindowID( hCtrl );
2543: 	HWND hParent = GetParent( hCtrl );
2544: 	return SendMessage
2545: 		(
2546: 			hParent,
2547: 			WM_COMMAND,
2548: 			MAKEWPARAM(wID, wNotifyCode),
2549: 			(LPARAM)hCtrl
2550: 		);
2551: }//SendNotifyCommand
2552: 
2553: //*********************************************************
2554: // SetClassBrush
2555: //   WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH, 
2556: //   BLACK_BRUSH, NULL_BRUSH, HOLLOW_BRUSH 
2557: //*********************************************************
2558: HBRUSH
2559: SetClassBrush
2560: 	(
2561: 		HWND   hWnd,
2562: 		HBRUSH hBrush
2563: 	)
2564: {
2565: 	// パラメタの仮定
2566: 	ASSERT( IsValidWindow( hWnd ) );
2567: 	ASSERT( IsValidBrushHandle( hBrush ) );
2568: 
2569: 	return (HBRUSH)SetClassLongPtr64( hWnd, GCL_HBRBACKGROUND, reinterpret_cast<LONG_PTR>( hBrush ) );
2570: }//SetClassBrush
2571: 
2572: //*********************************************************
2573: // SetClassCursor
2574: //*********************************************************
2575: HCURSOR 
2576: SetClassCursor
2577: 	(
2578: 		HWND    hWnd,
2579: 		HCURSOR hCursor
2580: 	)
2581: {
2582: 	// パラメタの仮定
2583: 	ASSERT( IsValidWindow( hWnd ) );
2584: 	ASSERT( IsValidCursorHandle( hCursor ) );
2585: 
2586: 	return (HCURSOR)SetClassLongPtr64( hWnd, GCL_HCURSOR, reinterpret_cast<LONG_PTR>( hCursor ) );
2587: }//SetClassCursor
2588: 
2589: //*********************************************************
2590: // SetClassIcon
2591: //   fType …… ICON_BIG, ICON_SMALL, ...
2592: //*********************************************************
2593: HICON
2594: SetClassIcon
2595: 	(
2596: 		HWND   hWnd,
2597: 		WPARAM fType,
2598: 		HICON  hIcon 
2599: 	)
2600: {
2601: 	// パラメタの仮定
2602: 	ASSERT( IsValidWindow( hWnd ) );
2603: 	ASSERT( ( ICON_BIG   == fType )
2604: 	     || ( ICON_SMALL == fType ) );
2605: 	ASSERT( IsValidIconHandle( hIcon ) );
2606: 
2607: 	return (HICON)SetClassLongPtr64
2608: 		(
2609: 			hWnd,
2610: 			((ICON_BIG == fType) ? GCL_HICON: GCL_HICONSM),
2611: 			reinterpret_cast<LONG_PTR>( hIcon )
2612: 		);
2613: }//SetClassIcon
2614: 
2615: //*********************************************************
2616: // SetClassStyle
2617: //*********************************************************
2618: DWORD
2619: SetClassStyle
2620: 	(
2621: 		HWND  hWnd,
2622: 		DWORD dwStyle
2623: 	)
2624: {
2625: 	// パラメタの仮定
2626: 	ASSERT( IsValidWindow( hWnd ) );
2627: 
2628: 	return (DWORD)SetClassLongPtr64( hWnd, GCL_STYLE, dwStyle );
2629: }//SetClassStyle
2630: 
2631: //*********************************************************
2632: // SetDeferWindowSize
2633: //*********************************************************
2634: HDWP
2635: SetDeferWindowSize
2636: 	(
2637: 		HDWP *phWinPosInfo,
2638: 		HWND  hWnd, 
2639: 		int   Width, 
2640: 		int   Height
2641: 	)
2642: {
2643: 	// パラメタの仮定
2644: 	ASSERT( IsValidWindow( hWnd ) );
2645: 	ASSERT( IsValidPtr( phWinPosInfo, sizeof( *phWinPosInfo ) ) );
2646: 	ASSERT( *phWinPosInfo );
2647: 
2648: 	*phWinPosInfo = DeferWindowPos( *phWinPosInfo, hWnd, null, 0, 0, Width, Height, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER );
2649: 	return *phWinPosInfo;
2650: }//SetDeferWindowSize
2651: 
2652: //*********************************************************
2653: // SetDlgItemFocus
2654: // ウィンドウ hWnd の識別子 nID を持つ子ウィンドウにフォーカスを設定する
2655: // 以前にフォーカスを持っていたウィンドウへのハンドルを返す
2656: //*********************************************************
2657: HWND
2658: SetDlgItemFocus
2659: 	(
2660: 		HWND hWnd,
2661: 		int  nID
2662: 	)
2663: {
2664: 	// パラメタの仮定
2665: 	ASSERT( IsValidWindow( hWnd ) );
2666: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
2667: 
2668: 	HWND hCtrl = GetDlgItem( hWnd, nID );
2669: 	return SetFocus( hCtrl );
2670: }//SetDlgItemFocus
2671: 
2672: //*********************************************************
2673: // SetMenuString()
2674: //   メニュー項目の 文字列 を変更する。
2675: //   文字列の設定に成功すれば 真 を返す。
2676: //
2677: // HMENU hMenu
2678: //   変更対象のメニュー項目を持つ 親メニュー のハンドル
2679: //
2680: // UINT uID
2681: //   flags が MF_BYCOMMAND の場合
2682: //     メニュー項目の 項目識別子
2683: //   flags が MF_BYPOSITION の場合
2684: //     メニュー項目の 0 開始位置
2685: //
2686: // UINT flags
2687: //   uID の意味を指定する。
2688: //   MF_BYCOMMAND or MF_BYPOSITION
2689: //
2690: // const char *string
2691: //   メニュー項目に指定する 文字列
2692: //
2693: //*********************************************************
2694: bool // 成功すれば 真
2695: SetMenuString
2696: 	(
2697: 		      HMENU  hMenu, // 親メニューのハンドル
2698: 		      UINT   uID,   // メニュー項目の 識別子 or 位置
2699: 		      UINT   flags, // MF_BYCOMMAND or MF_BYPOSITION
2700: 		const char *string // 指定する 文字列
2701: 	)
2702: {
2703: 	// パラメタの仮定
2704: 	ASSERT( IsValidMenu( hMenu ) );
2705: 	ASSERT( INVALID_MENUITEMID != uID );
2706: 	ASSERT( (MF_BYCOMMAND  == flags)
2707: 	     || (MF_BYPOSITION == flags) );
2708: 	ASSERT( IsValidMenuString( string ) );
2709: 
2710: 	// 項目識別子 を取得する。
2711: 	const UINT uNewID = ((MF_BYCOMMAND == flags) ? uID : GetMenuItemID(hMenu, uID));
2712: 	if ( INVALID_MENUITEMID == uNewID )
2713: 		return false; // 関数が失敗した場合は 偽 を返す。
2714: 
2715: 	// 文字列を変更する
2716: 	return !! ModifyMenu( hMenu, uID, flags, uNewID, string );
2717: }//SetMenuString
2718: 
2719: //*********************************************************
2720: // SetWindowExStyle
2721: //*********************************************************
2722: DWORD
2723: SetWindowExStyle
2724: 	(
2725: 		HWND  hWnd,
2726: 		DWORD dwExStyle
2727: 	)
2728: {
2729: 	// パラメタの仮定
2730: 	ASSERT( IsValidWindow( hWnd ) );
2731: 
2732: 	return (DWORD)SetWindowLongPtr64( hWnd, GWL_EXSTYLE, dwExStyle );
2733: }//SetWindowExStyle
2734: 
2735: //*********************************************************
2736: // SetWindowIcon
2737: //   WPARAM --- ICON_BIG, ICON_SMALL, ...
2738: //*********************************************************
2739: HICON
2740: SetWindowIcon
2741: 	(
2742: 		HWND   hWnd,
2743: 		WPARAM fType,
2744: 		HICON  hIcon
2745: 	)
2746: {
2747: 	// パラメタの仮定
2748: 	ASSERT( IsValidWindow( hWnd ) );
2749: 	ASSERT( (ICON_BIG   == fType)
2750: 	     || (ICON_SMALL == fType) );
2751: 	ASSERT( IsValidIconHandle( hIcon ) );
2752: 
2753: 	return (HICON)SendMessage( hWnd, WM_SETICON, fType, reinterpret_cast<LPARAM>( hIcon ) );
2754: }//SetWindowIcon
2755: 
2756: //*********************************************************
2757: // SetWindowPriority
2758: //*********************************************************
2759: bool
2760: SetWindowPriority
2761: 	(
2762: 		HWND  hWnd,
2763: 		DWORD dwPriorityClass
2764: 	)
2765: {
2766: 	// パラメタの仮定
2767: 	ASSERT( IsValidWindow( hWnd ) );
2768: 	ASSERT( ( NORMAL_PRIORITY_CLASS   == dwPriorityClass )
2769: 	     || ( IDLE_PRIORITY_CLASS     == dwPriorityClass ) 
2770: 	     || ( HIGH_PRIORITY_CLASS     == dwPriorityClass ) 
2771: 	     || ( REALTIME_PRIORITY_CLASS == dwPriorityClass ) );
2772: 
2773: 	HANDLE hProcess = OpenWindowProcess( hWnd, PROCESS_ALL_ACCESS, false );
2774: 	if ( !hProcess )
2775: 		return false;
2776: 
2777: 	VERIFY( SetPriorityClass( hProcess, dwPriorityClass ) );
2778: 	VERIFY( CloseHandle( hProcess ) );
2779: 	return true;
2780: }//SetWindowPriority
2781: 
2782: //*********************************************************
2783: // SetWindowSize
2784: //*********************************************************
2785: bool
2786: SetWindowSize
2787: 	(
2788: 		HWND hWnd,
2789: 		int  nWidth, 
2790: 		int  nHeight
2791: 	)
2792: {
2793: 	// パラメタの仮定
2794: 	ASSERT( IsValidWindow( hWnd ) );
2795: 
2796: 	return !! SetWindowPos( hWnd, null, 0, 0, nWidth, nHeight, SWP_NOMOVE|SWP_NOZORDER );
2797: }//SetWindowSize
2798: 
2799: //*********************************************************
2800: // SetWindowStyle
2801: //*********************************************************
2802: DWORD
2803: SetWindowStyle
2804: 	(
2805: 		HWND  hWnd,
2806: 		DWORD dwStyle
2807: 	)
2808: {
2809: 	// パラメタの仮定
2810: 	ASSERT( IsValidWindow( hWnd ) );
2811: 
2812: 	return (DWORD)SetWindowLongPtr64( hWnd, GWL_STYLE, dwStyle );
2813: }//SetWindowStyle
2814: 
2815: //*********************************************************
2816: // SetWindowTopmost
2817: //*********************************************************
2818: bool
2819: SetWindowTopmost
2820: 	(
2821: 		HWND hWnd
2822: 	)
2823: {
2824: 	// パラメタの仮定
2825: 	ASSERT( IsValidWindow( hWnd ) );
2826: 
2827: 	return !! SetWindowPos
2828: 		(
2829: 			hWnd,
2830: 			HWND_TOPMOST,
2831: 			0,
2832: 			0,
2833: 			0,
2834: 			0,
2835: 			SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOSENDCHANGING
2836: 		);
2837: }//SetWindowTopmost
2838: 
2839: //*********************************************************
2840: // ShiftDeferDlgItemSize
2841: //*********************************************************
2842: HDWP
2843: ShiftDeferDlgItemSize
2844: 	(
2845: 		HDWP *phWinPosInfo,
2846: 		HWND  hWnd,
2847: 		int   nID,
2848: 		int   nX,
2849: 		int   nY
2850: 	)
2851: {
2852: 	// パラメタの仮定
2853: 	ASSERT( IsValidWindow( hWnd ) );
2854: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
2855: 	ASSERT( IsValidPtr( phWinPosInfo, sizeof( *phWinPosInfo ) ) );
2856: 	ASSERT( *phWinPosInfo );
2857: 
2858: 	return ShiftDeferDlgItem( phWinPosInfo, hWnd, nID, 0, 0, nX, nY );
2859: }//ShiftDeferDlgItemSize
2860: 
2861: //*********************************************************
2862: // ShiftDeferDlgItem
2863: //*********************************************************
2864: HDWP
2865: ShiftDeferDlgItem
2866: 	(
2867: 		HDWP *phWinPosInfo,
2868: 		HWND  hWnd,
2869: 		int   nID, 
2870: 		int   nShiftPosX,
2871: 		int   nShiftPosY,
2872: 		int   nShiftSizeX,
2873: 		int   nShiftSizeY 
2874: 	)
2875: {
2876: 	// パラメタの仮定
2877: 	ASSERT( IsValidWindow( hWnd ) );
2878: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
2879: 	ASSERT( IsValidPtr( phWinPosInfo, sizeof( *phWinPosInfo ) ) );
2880: 
2881: 	HWND hCtrl = GetDlgItem( hWnd, nID );
2882: 	return ShiftDeferWindow( phWinPosInfo, hCtrl, nShiftPosX, nShiftPosY, nShiftSizeX, nShiftSizeY );
2883: }//ShiftDeferDlgItem
2884: 
2885: //*********************************************************
2886: // ShiftDeferWindow
2887: //*********************************************************
2888: HDWP
2889: ShiftDeferWindow
2890: 	(
2891: 		HDWP *phWinPosInfo,
2892: 		HWND  hWnd,
2893: 		int   shift_pos_x,
2894: 		int   shift_pos_y,
2895: 		int   shift_size_x,
2896: 		int   shift_size_y
2897: 	)
2898: {
2899: 	// パラメタの仮定
2900: 	ASSERT( IsValidWindow( hWnd ) );
2901: 	ASSERT( IsValidPtr( phWinPosInfo, sizeof( *phWinPosInfo ) ) );
2902: 	ASSERT( *phWinPosInfo );
2903: 
2904: 	POINT pt; 
2905: 	GetWindowPoint( hWnd, &pt );
2906: 
2907: 	HWND hParent = GetParent( hWnd );
2908: 	if ( hParent && IsChild(hParent, hWnd) )
2909: 	{
2910: 		ScreenToClient( hParent, &pt );
2911: 	}
2912: 
2913: 	const int width  = GetWindowWidth( hWnd );
2914: 	const int height = GetWindowHeight( hWnd );
2915: 	*phWinPosInfo = DeferWindowPos
2916: 		(
2917: 			*phWinPosInfo,
2918: 			hWnd,
2919: 			null,
2920: 			pt.x   + shift_pos_x,
2921: 			pt.y   + shift_pos_y,
2922: 			width  + shift_size_x,
2923: 			height + shift_size_y,
2924: 			SWP_NOACTIVATE | SWP_NOZORDER
2925: 		);
2926: 	return *phWinPosInfo;
2927: }//ShiftDeferWindow
2928: 
2929: //*********************************************************
2930: // ShiftDeferWindowPos
2931: //*********************************************************
2932: HDWP
2933: ShiftDeferWindowPos
2934: 	(
2935: 		HDWP *phWinPosInfo,
2936: 		HWND  hWnd,
2937: 		int   nShiftX,
2938: 		int   nShiftY
2939: 	)
2940: {
2941: 	// パラメタの仮定
2942: 	ASSERT( IsValidWindow( hWnd ) );
2943: 	ASSERT( IsValidPtr( phWinPosInfo, sizeof( *phWinPosInfo ) ) );
2944: 	ASSERT( *phWinPosInfo );
2945: 
2946: 	POINT ptWindow;
2947: 	VERIFY( GetWindowPoint( hWnd, &ptWindow ) );
2948: 
2949: 	HWND  hParent = GetParent( hWnd );
2950: 	if ( hParent && IsChild(hParent,hWnd) )
2951: 	{
2952: 		VERIFY( ScreenToClient( hParent, &ptWindow ) );
2953: 	}
2954: 
2955: 	return DeferWindowMove( phWinPosInfo, hWnd, ptWindow.x + nShiftX, ptWindow.y + nShiftY );
2956: }//ShiftDeferWindowPos
2957: 
2958: //*********************************************************
2959: // ShiftDeferWindowSize
2960: //*********************************************************
2961: HDWP
2962: ShiftDeferWindowSize
2963: 	(
2964: 		HDWP *phWinPosInfo,
2965: 		HWND  hWnd,
2966: 		int   nShiftX,
2967: 		int   nShiftY
2968: 	)
2969: {
2970: 	// パラメタの仮定
2971: 	ASSERT( IsValidWindow( hWnd ) );
2972: 	ASSERT( IsValidPtr( phWinPosInfo, sizeof( *phWinPosInfo ) ) );
2973: 	ASSERT( *phWinPosInfo );
2974: 
2975: 	const int width  = GetWindowWidth( hWnd );
2976: 	const int height = GetWindowHeight( hWnd );
2977: 	return SetDeferWindowSize( phWinPosInfo, hWnd, width + nShiftX, height + nShiftY );
2978: }//ShiftDeferWindowSize
2979: 
2980: //*********************************************************
2981: // ShiftDlgItemPos
2982: //*********************************************************
2983: bool
2984: ShiftDlgItemPos
2985: 	(
2986: 		HWND hWnd, 
2987: 		int  nID,
2988: 		int  nX,
2989: 		int  nY
2990: 	)
2991: {
2992: 	// パラメタの仮定
2993: 	ASSERT( IsValidWindow( hWnd ) );
2994: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
2995: 
2996: 	HWND hCtrl = GetDlgItem( hWnd, nID );
2997: 	return ShiftWindowPos( hCtrl, nX, nY );
2998: }//ShiftDlgItemPos
2999: 
3000: //*********************************************************
3001: // ShiftDlgItemSize
3002: //*********************************************************
3003: bool
3004: ShiftDlgItemSize
3005: 	(
3006: 		HWND hWnd, 
3007: 		int  nID,
3008: 		int  nX,
3009: 		int  nY
3010: 	)
3011: {
3012: 	// パラメタの仮定
3013: 	ASSERT( IsValidWindow( hWnd ) );
3014: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
3015: 
3016: 	HWND hCtrl = GetDlgItem( hWnd, nID );
3017: 	return ShiftWindowSize( hCtrl, nX, nY );
3018: }//ShiftDlgItemSize
3019: 
3020: //*********************************************************
3021: // ShiftWindowPos
3022: //*********************************************************
3023: bool
3024: ShiftWindowPos
3025: 	(
3026: 		HWND hWnd,
3027: 		int  nShiftX,
3028: 		int  nShiftY
3029: 	)
3030: {
3031: 	// パラメタの仮定
3032: 	ASSERT( IsValidWindow( hWnd ) );
3033: 
3034: 	POINT ptWindow;
3035: 	VERIFY( GetWindowPoint( hWnd, &ptWindow ) );
3036: 
3037: 	HWND hParent = GetParent( hWnd );
3038: 	if ( hParent && IsChild(hParent,hWnd) )
3039: 	{
3040: 		VERIFY( ScreenToClient( hParent, &ptWindow ) );
3041: 	}
3042: 
3043: 	return WindowMove( hWnd, ptWindow.x + nShiftX, ptWindow.y + nShiftY );
3044: }//ShiftWindowPos
3045: 
3046: //*********************************************************
3047: // ShiftWindowSize
3048: //*********************************************************
3049: bool
3050: ShiftWindowSize
3051: 	(
3052: 		HWND hWnd,
3053: 		int  nShiftX, 
3054: 		int  nShiftY
3055: 	)
3056: {
3057: 	// パラメタの仮定
3058: 	ASSERT( IsValidWindow( hWnd ) );
3059: 
3060: 	const int width  = GetWindowWidth( hWnd );
3061: 	const int height = GetWindowHeight( hWnd );
3062: 	return SetWindowSize( hWnd, width + nShiftX, height + nShiftY );
3063: }//ShiftWindowSize
3064: 
3065: 
3066: //------------------------------------------------------------------------------------------------------------------
3067: // t
3068: //------------------------------------------------------------------------------------------------------------------
3069: //*********************************************************
3070: // TopmostWindow
3071: //*********************************************************
3072: bool
3073: TopmostWindow
3074: 	(
3075: 		HWND hWnd,
3076: 		bool bTopmost
3077: 	)
3078: {
3079: 	// パラメタの仮定
3080: 	ASSERT( IsValidWindow( hWnd ) );
3081: 
3082: 	if ( bTopmost )
3083: 		return SetWindowTopmost( hWnd );
3084: 	else
3085: 		return ResetWindowTopmost( hWnd );
3086: }//TopmostWindow
3087: 
3088: 
3089: //------------------------------------------------------------------------------------------------------------------
3090: // u
3091: //------------------------------------------------------------------------------------------------------------------
3092: 
3093: //------------------------------------------------------------------------------------------------------------------
3094: // v
3095: //------------------------------------------------------------------------------------------------------------------
3096: //*********************************************************
3097: // VisibleDlgItem
3098: //*********************************************************
3099: bool
3100: VisibleDlgItem
3101: 	(
3102: 		HWND hWnd,
3103: 		int  nID,
3104: 		bool bVisible
3105: 	)
3106: {
3107: 	// パラメタの仮定
3108: 	ASSERT( IsValidWindow( hWnd ) );
3109: 	ASSERT( IsValidDlgItem( hWnd, nID ) );
3110: 
3111: 	HWND hCtrl = GetDlgItem( hWnd, nID );
3112: 	return VisibleWindow( hCtrl, bVisible );
3113: }//VisibleDlgItem
3114: 
3115: //*********************************************************
3116: // VisibleWindow
3117: //   疑問: SW_SHOW, SW_SHOWNA のどちらにするべきか……
3118: //*********************************************************
3119: bool
3120: VisibleWindow
3121: 	(
3122: 		HWND hWnd,
3123: 		bool bVisible
3124: 	)
3125: {
3126: 	// パラメタの仮定
3127: 	ASSERT( IsValidWindow( hWnd ) );
3128: 
3129: 	return !! ShowWindow( hWnd, bVisible ? SW_SHOWNA : SW_HIDE );
3130: }//VisibleWindow
3131: 
3132: 
3133: //------------------------------------------------------------------------------------------------------------------
3134: // w
3135: //------------------------------------------------------------------------------------------------------------------
3136: //*********************************************************
3137: // WindowCaptionMoveToCursorPos
3138: //*********************************************************
3139: bool
3140: WindowCaptionMoveToCursorPos
3141: 	(
3142: 		HWND hWnd
3143: 	)
3144: {
3145: 	// パラメタの仮定
3146: 	ASSERT( IsValidWindow( hWnd ) );
3147: 
3148: 	//
3149: 	POINT pt;
3150: 	VERIFY( GetCursorPos( &pt ) );
3151: 	pt.x = pt.x - (GetWindowWidth(hWnd) / 2);
3152: 	pt.y = pt.y - (GetSystemMetrics(SM_CYCAPTION) / 2);
3153: 
3154: 	// デスクトップ作業領域に表示されるよう移動する
3155: 	RECT rcWorkarea;
3156: 	VERIFY( GetWorkareaRect( &rcWorkarea ) );
3157: 	if ( pt.x > rcWorkarea.right  - GetWindowWidth(hWnd)  )
3158: 		pt.x = rcWorkarea.right - GetWindowWidth(hWnd);
3159: 	if ( pt.x < rcWorkarea.left )
3160: 		pt.x = rcWorkarea.left;
3161: 	if ( pt.y > rcWorkarea.bottom - GetWindowHeight(hWnd) )
3162: 		pt.y = rcWorkarea.bottom - GetWindowHeight(hWnd);
3163: 	if ( pt.y < rcWorkarea.top )
3164: 		pt.y = rcWorkarea.top;
3165: 
3166: 	//
3167: 	HWND hParent = GetParent( hWnd );
3168: 	if ( hParent && IsChild(hParent, hWnd) )
3169: 	{
3170: 		VERIFY( ScreenToClient( hParent, &pt ) );
3171: 	}
3172: 
3173: 	return WindowMove( hWnd, pt.x, pt.y );
3174: }//WindowCaptionMoveToCursorPos
3175: 
3176: //*********************************************************
3177: // WindowToClient
3178: // ウィンドウ座標 pt をクライエント座標に変換する
3179: //*********************************************************
3180: bool
3181: WindowToClient
3182: 	(
3183: 		HWND   hWnd,
3184: 		POINT *pt
3185: 	)
3186: {
3187: 	// パラメタの仮定
3188: 	ASSERT( IsValidWindow( hWnd ) );
3189: 	ASSERT( IsValidPtr( pt, sizeof( *pt ) ) );
3190: 
3191: 	VERIFY( WindowToScreen( hWnd, pt ) );
3192: 	return boolean_cast( ScreenToClient( hWnd, pt ) );
3193: }//WindowToClient
3194: 
3195: //*********************************************************
3196: // WindowToScreen
3197: // ウィンドウ座標 pt をスクリーン座標に変換する
3198: //*********************************************************
3199: bool
3200: WindowToScreen
3201: 	(
3202: 		HWND   hWnd, 
3203: 		POINT *pt
3204: 	)
3205: {
3206: 	// パラメタの仮定
3207: 	ASSERT( IsValidWindow( hWnd ) );
3208: 	ASSERT( IsValidPtr( pt, sizeof( *pt ) ) );
3209: 
3210: 	POINT ptWindow;
3211: 	VERIFY( GetWindowPoint( hWnd, &ptWindow ) );
3212: 	VERIFY( OffsetPoint( pt, ptWindow.x, ptWindow.y ) );
3213: 	return true;
3214: }//WindowToScreen
3215: 
3216: //*********************************************************
3217: // WindowMove
3218: //*********************************************************
3219: bool
3220: WindowMove
3221: 	(
3222: 		HWND hWnd, 
3223: 		int  nPosX,
3224: 		int  nPosY
3225: 	)
3226: {
3227: 	// パラメタの仮定
3228: 	ASSERT( IsValidWindow( hWnd ) );
3229: 
3230: 	return !! SetWindowPos( hWnd, null, nPosX, nPosY, 0, 0, SWP_NOSIZE|SWP_NOZORDER );
3231: }//WindowMove
3232: 
3233: //*********************************************************
3234: // WindowMoveIntoWorkarea
3235: //*********************************************************
3236: bool
3237: WindowMoveIntoWorkarea
3238: 	(
3239: 		HWND hWnd
3240: 	)
3241: {
3242: 	// パラメタの仮定
3243: 	ASSERT( IsValidWindow( hWnd ) );
3244: 
3245: 	//
3246: 	POINT pt;
3247: 	RECT rcWindow; // スクリーン座標
3248: 	GetWindowRect( hWnd, &rcWindow );
3249: 	MakePoint( &pt, rcWindow.left, rcWindow.top );
3250: 
3251: 	// デスクトップ作業領域に表示されるよう移動する
3252: 	RECT rcWorkarea;
3253: 	VERIFY( GetWorkareaRect( &rcWorkarea ) );
3254: 
3255: 	if ( rcWorkarea.right < rcWindow.right )
3256: 		pt.x = rcWorkarea.right - (rcWindow.right - rcWindow.left);
3257: 	if ( rcWorkarea.bottom < rcWindow.bottom )
3258: 		pt.y = rcWorkarea.bottom - (rcWindow.bottom - rcWindow.top);
3259: 
3260: 	if ( rcWindow.left < rcWorkarea.left )
3261: 		pt.x = rcWorkarea.left;
3262: 	if ( rcWindow.top < rcWorkarea.top  )
3263: 		pt.y = rcWorkarea.top;
3264: 
3265: 	//
3266: 	HWND hwndParent = GetParent( hWnd );
3267: 	if ( hwndParent && IsChild( hwndParent, hWnd ) )
3268: 	{
3269: 		VERIFY( ScreenToClient( hwndParent, &pt ) );
3270: 	}
3271: 
3272: 	return WindowMove( hWnd, pt.x, pt.y );
3273: }//WindowMoveIntoWorkarea
3274: 
3275: //*********************************************************
3276: // WindowMoveToCursorPos
3277: //*********************************************************
3278: bool
3279: WindowMoveToCursorPos
3280: 	(
3281: 		HWND hWnd
3282: 	)
3283: {
3284: 	// パラメタの仮定
3285: 	ASSERT( IsValidWindow( hWnd ) );
3286: 
3287: 	//
3288: 	const int width  = GetWindowWidth( hWnd );
3289: 	const int height = GetWindowHeight( hWnd );
3290: 
3291: 	//
3292: 	POINT pt;
3293: 	VERIFY( GetCursorPos( &pt ) );
3294: 	pt.x = pt.x - (width  / 2);
3295: 	pt.y = pt.y - (height / 2);
3296: 
3297: 	// デスクトップ作業領域に表示されるよう移動する
3298: 	RECT rcWorkarea;
3299: 	VERIFY( GetWorkareaRect( &rcWorkarea ) );
3300: 	if ( rcWorkarea.right  < pt.x + width    )
3301: 		pt.x = rcWorkarea.right - width;
3302: 	if ( pt.x              < rcWorkarea.left )
3303: 		pt.x = rcWorkarea.left;
3304: 	if ( rcWorkarea.bottom < pt.y + height   )
3305: 		pt.y = rcWorkarea.bottom - height;
3306: 	if ( pt.y              < rcWorkarea.top  )
3307: 		pt.y = rcWorkarea.top;
3308: 
3309: 	//
3310: 	HWND hParent = GetParent( hWnd );
3311: 	if ( hParent && IsChild(hParent, hWnd) )
3312: 	{
3313: 		VERIFY( ScreenToClient( hParent, &pt ) );
3314: 	}
3315: 
3316: 	return WindowMove( hWnd, pt.x, pt.y );
3317: }//WindowMoveToCursorPos
3318: 
3319: 
3320: //------------------------------------------------------------------------------------------------------------------
3321: // x
3322: //------------------------------------------------------------------------------------------------------------------
3323: 
3324: //------------------------------------------------------------------------------------------------------------------
3325: // y
3326: //------------------------------------------------------------------------------------------------------------------
3327: 
3328: //------------------------------------------------------------------------------------------------------------------
3329: // z
3330: //------------------------------------------------------------------------------------------------------------------
3331: 
3332: 
3333: //** end **
3334: 
3335: 

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > tools > toolwind.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/toolwind_cpp.shtml
『新妻LOVELY×CATION』を応援しています!